NYOJ 860 又见01背包
2015-08-05 18:07
260 查看
NYOJ 860 又见01背包 2015-08-05 18:07 12人阅读 评论(0) 收藏 编辑 删除 时间限制: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 #include <stdio.h> #include <string.h> #define Min(a,b) a<b?a:b const int N = 10003; int dp ; int weight[102]; int value[102]; int main() { int n, w; while (scanf("%d%d", &n, &w) == 2) { int sum = 0; for (int i = 0; i < n; i++) { scanf("%d%d", &weight[i], &value[i]); sum += value[i];//sum保存所有的价值之和 } memset(dp, 0x3f, sizeof(dp));//初始化数组要为无穷大,因为是要找最小值,所以默认无穷大 dp[0] = 0; for (int i = 0; i < n; i++) { for (int j = sum; j >= value[i]; j--) { dp[j] = Min(dp[j], dp[j - value[i]] + weight[i]);//每在原有价值基础上增添时,比较重量,取最小者,相当于质量一定,求价值最大 } } for (int i = sum; i >=0; i--) if (dp[i] <= w) { printf("%d\n", i); break; } } return 0; } 思路详解:本题由于w的值范围较大,所以才去另一种思想,即当价值有时,求出重量的最小值
相关文章推荐
- IO:缓冲
- 一些baidu面经
- Android中visibility属性VISIBLE、INVISIBLE、GONE的区别
- 字符串与指针
- LoadRunner中访问mysql数据库
- WSGI 简介
- C#中的 new Random()
- HTML5吧!少年
- App Transport Security (ATS)
- mysql.sock文件丢失
- 一串整数倒置
- 《iOS 高级编程》之Tableview进阶指南
- PrintWriter类
- eclipse Outline的各种符号含义
- Android酷炫实用的开源框架(UI框架)
- ssh中“Host key verification failed.“的解决方案
- 求和问题
- 天涯思無窮,誰與共?
- Linux du 和 df 的区别
- ElasticSearch:Nginx可以给ElasticSearch集群带来什么福利?