您的位置:首页 > 其它

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的值范围较大,所以才去另一种思想,即当价值有时,求出重量的最小值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: