nyoj860 又见01背包
2016-04-04 18:41
232 查看
nyoj860
时间限制:1000 ms | 内存限制:65535 KB
难度:3
描述
有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W
的物品,求所有挑选方案中物品价值总和的最大值。
1 <= n <=100
1 <= wi <= 10^7
1 <= vi <= 100
1 <= W <= 10^9
输入多组测试数据。
每组测试数据第一行输入,n 和 W ,接下来有n行,每行输入两个数,代表第i个物品的wi 和 vi。
输出满足题意的最大价值,每组测试数据占一行。
样例输入
样例输出
这题,关键在于价值的范围! vi<100 ,而最多n种(<= 100),那么开数组最多100 * 100 就可以了,远远小于以重量开始推取得的最大价值(在时间和空间上!10^9 再加上二重循环,怎么可能不超时嘞)
转换思路:
最大价值 对应的 最小重量。
通过递推,从价值为0开始,一层层递推出(前面的价值的 重量最小量决定后面的价值的重量最小量。
dp[i] = min(dp[i] ,dp[i - vi[j]]+wi[j]) vi价值 wi重量
最后呢,由于推出来的是 从0 - sum_max_v每个都对应的是最小重量,那么只需从上往下找到不大于w的就可以停止,找到了下标所代表的最大价值。
又见01背包
时间限制:1000 ms | 内存限制:65535 KB难度:3
描述
有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W
的物品,求所有挑选方案中物品价值总和的最大值。
1 <= n <=100
1 <= wi <= 10^7
1 <= vi <= 100
1 <= W <= 10^9
输入多组测试数据。
每组测试数据第一行输入,n 和 W ,接下来有n行,每行输入两个数,代表第i个物品的wi 和 vi。
输出满足题意的最大价值,每组测试数据占一行。
样例输入
4 5 2 3 1 2 3 4 2 2
样例输出
7
这题,关键在于价值的范围! vi<100 ,而最多n种(<= 100),那么开数组最多100 * 100 就可以了,远远小于以重量开始推取得的最大价值(在时间和空间上!10^9 再加上二重循环,怎么可能不超时嘞)
转换思路:
最大价值 对应的 最小重量。
通过递推,从价值为0开始,一层层递推出(前面的价值的 重量最小量决定后面的价值的重量最小量。
dp[i] = min(dp[i] ,dp[i - vi[j]]+wi[j]) vi价值 wi重量
最后呢,由于推出来的是 从0 - sum_max_v每个都对应的是最小重量,那么只需从上往下找到不大于w的就可以停止,找到了下标所代表的最大价值。
#include<stdio.h> #include<string.h> #define min(a,b) a<b?a:b int dp[10005]; int vi[105],wi[105]; int main() { int i,j,n,w,sumv; while( scanf("%d %d",&n,&w)!=EOF) { sumv =0; //注意一定要初始化 ,,要不然程序出不来结果,因为涉及到了数组界限问题 for(i = 0;i<n;i++) { scanf("%d %d",&wi[i],&vi[i]); sumv += vi[i]; } memset(dp,100,sizeof(dp)); dp[0] = 0; for( i = n-1 ;i>=0 ;i--) for( j = sumv;j>=vi[i] ;j--) //小心超界啦 j〉=vi[i] ,注意 { dp[j] = min(dp[j] ,dp[j-vi[i]]+wi[i]); } for(i = sumv;i>=0;) if(w>= dp[i])break; else i--; printf("%d\n",i); } return 0; }
相关文章推荐
- YTU 3003: 括号匹配(栈和队列)
- POJ 1276 Cash Machine 多重背包O(n*m)算法
- 批量修改文件名
- OSX 使用“终端”远程登录linux主机
- 我 && yii2 (一)
- 四则运算———安卓版
- LeetCode之7 --- Reverse Integer
- Linux下PHP+MySQL+CoreSeek中文检索引擎配置
- 正能量!!!
- 批量修改文件
- C++文件路径的写法
- c++中不能重载的运算符
- Java基础-多线程-③线程同步之synchronized
- POJ 2236 Wireless Network
- django之创建第2个项目
- 一站式学习Wireshark(八):应用Wireshark过滤条件抓取特定数据流
- JavaScript之Ajax-6 Ajax的增强操作(jQuery对Ajax的支持、表单操作)
- typedef struct
- Linux kernel中的内核线程-kthreadd
- 匿名对象的使用