hrbust 1558 小背包(简单01背包)水坑
小背包
Time Limit: 1000 MS Memory Limit: 10240 K
Total Submit: 1220(237 users) Total Accepted: 307(208 users) Rating: Special Judge: No
Description
有一个容量为m(1<=m<=4000000)的背包,有n(1<=n<=16)个物品,每个物品有体积v(1<=v<=2012)和价值w(0<=2012),现在要你选择一些物品,使得背包所装物品的总价值最大。
Input
有多组测试数据,但是不会超过10组。
对于每组测试数据,第一行是两个整数m和n,表示背包容量的和物品个数。接下来有n行,每行有两个整数,表示一个物品的体积和价值。
输入到文件结束。
Output
对于每组测试数据,输出一行,包含一个整数,为背包能装下物品的最大价值。
Sample Input
10 3
6 9
5 5
5 5
3 2
1 2
2 1
Sample Output
10
3
过程都只是一个普通的小背包,注意坑点在最大容积,第一眼看,可能觉得一定会超时爆内存,结果再往后面看发现只有16个物品,再往后看,每个物品最大只有2012,也就是说总重不会超过16*2012,背包容积最大值远大于物品体积,此时,dp数组只用设到33000左右就好,但为防止m过大,毕竟是要这个数据带入进去遍历dp数组的,所以即使没装那么多,也会遍历数组遍历到爆,RE就不可避免了。于是多加个判定条件,当容积远远大于所有物品体积时,直接全部装进去就好了,不用再执行后面的算法。这样也是有道理的,毕竟你数组就是最大体积了,容积再大,也是都可以装进去的了,不仅省时还能避免数组越界
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[20][34000];///好坑啊,题目说了背包那么大,但是实际16个物品每个物品2012的体积,根本用不了那么大
struct box
{int cost;int value;
}num[20];
int main()
{int i,j,n,m;while(scanf("%d%d",&m,&n)!=EOF){int sum=0,sum2=0;memset(dp,0,sizeof(dp));for(i=1;i<=n;i++){scanf("%d%d",&num[i].cost,&num[i].value);sum=sum+num[i].cost;sum2=sum2+num[i].value;}if(sum<m)///注意自己输入的是m,即使合在一起的体积没那么大,容积还是会在遍历时用到m的数值,而发生数组越界,因此注意{printf("%d\n",sum2);///当输入的容积大于总体积时,可以直接输出所有的价值和,不用一个一个装上去了continue;}for(i=num[1].cost;i<=m;i++){dp[1][i]=num[1].value;}for(i=2;i<=n;i++){for(j=1;j<=m;j++){if(j>=num[i].cost){dp[i][j]=max(dp[i-1][j],dp[i-1][j-num[i].cost]+num[i].value);///记住啊,容积减掉当前遍历的那个物品的体积,个数也要减掉一个诶}elsedp[i][j]=dp[i-1][j];///是物品-1,不是容积-1,是如果装不了,那就继承上面那个物品的在此容积下的价值!!!}}
// for(i=0;i<=n;i++)///动态规划表超美的
// {// for(j=0;j<=m;j++)
// {// printf(" %d",dp[i][j]);
// }
// printf("\n");
// }printf("%d\n",dp[n][m]);}return 0;
}
hrbust 1558 小背包(简单01背包)水坑相关推荐
- HDU2602Bone Collector 简单0-1背包
HDU2602Bone Collector 简单0-1背包 Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- 习题整理(简单01背包 可用查并集2022/4/24)
习题整理 提示:之前的习题在习题集合 文章目录 习题整理 一.诱人的宝藏 1.思路 2.代码 二.晚宴 1.思路 2.代码 三.医师之路 1.思路 2.扩展知识 3.代码 总结 提示:以下是本篇文章正 ...
- hdu 1881(简单01背包)
毕业bg Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Des ...
- 简单01背包 POJ3211 Washing Clothes 多种衣服分别dp
题目连接:http://poj.org/problem?id=3211 大意就是 一个人洗衣服,然后找他媳妇帮忙.有n种颜色的衣服,和m件衣服,每件衣服的颜色和洗出来的时间都会给出来.再洗的时候两个人 ...
- hdu1171 转化01背包,组合
题意就是给你一些有价值的物品,你要把它分成尽量相同的两份. #include <iostream> #include <cstring> #include <algori ...
- 01背包总结+传授个人经验
写在前面: 自从学了背包这个专题,感觉永远也写不完,之前写了三种类型的01背包,结果现在发现都是简单的01背包.后来又学了多重背包.完全背包,其中多重背包还可以进行二进制优化. 本文将对这几种常见的背 ...
- DP问题之01背包如此简单
01背包问题 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大. ...
- hdu 2546 饭卡——一道简单的 01背包
今天讲的是动态规划,学长们拉了13道题让我们做一下,一下午大概4小时,做了5道题(还是太弱了 摊手) 题意: 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上 ...
- 简单的01背包和完全背包
2020.12.30开始学习AcWing算法<算法竞赛进阶指南>: 上传博客方便复习. 01背包(每种物品只能使用一次): //Wecccccccc //2020.12.31 #inclu ...
最新文章
- R语言ggplot2可视化:可视化堆叠的直方图、添加每个分组的每个bin的计数标签、在堆叠直方图的bin中的每个分组部分添加数值标签
- 计算机初级学哪个公需课,西安职称评审申报你遇到以下问题了吗?
- python编程下载安卓版-python编程狮app下载|
- FPGA在各行业的应用分析
- dataframe常用处理
- 【CodeForces - 215B 】Olympic Medal (数学,公式推导)
- 多角度分析平台即服务?PaaS的类型和用例
- 【一】Jmeter:体系结构
- Python基础——zip
- vmware vsphere出现“需要整合虚拟机磁盘”的告警处理方法(完整版)
- 对不起,我不是你爸爸
- 使用ssh工具连接window虚拟机中的linux系统
- [北航软工]第二次团队作业
- 我的书进驻美国 amazon.com 、 ebay.com
- PCb过孔大小设置 / 丝印层字符尺寸设置
- C语言(百钱买百鸡问题)
- linux md是什么格式文件,MD_ 文件扩展名: 它是什么以及如何打开它?
- 错误码429是什么错误?
- oracle锁表后,系统能否自动解锁?
- php readfile 图片,使用php中的readfile能否读图片
热门文章
- 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java图书推荐系统93gei
- java手动注册filter,SpringBoot注册Filter的两种实现方式
- 雷军:技术立业 金山要向Google学习
- Android系国产手机操作系统汇总
- vue Element
- 阿里妈妈内容营销团队并入优酷 向樊路远汇报
- 摄像头拍摄运动物体,产生运动模糊/拖影的原因分析
- vue.js毕业设计,基于vue.js前后端分离订座预约系统(H5移动项目) 开题报告
- Swift 可选(Optionals)类型讲解
- nessus漏洞报告英文翻译中文脚本