背包问题——nyoj860 又见01背包
2015-04-14 22:14
381 查看
题目大意应该了都了解了吧。
分析:看题中给的数据可知W = 10^9数据太大, 开不了这么大的数组。但仔细看看你会发现 n<=100 ,vi <= 100 。他的总价值最多也不会超过10000。 那么我们就开一个d[i]数组,表示价值一定时,所占重量最小的状态数组。 这样数组就不会太大啦! 最重要的就是能想到这个。 其他的和01背包一样。
分析:看题中给的数据可知W = 10^9数据太大, 开不了这么大的数组。但仔细看看你会发现 n<=100 ,vi <= 100 。他的总价值最多也不会超过10000。 那么我们就开一个d[i]数组,表示价值一定时,所占重量最小的状态数组。 这样数组就不会太大啦! 最重要的就是能想到这个。 其他的和01背包一样。
#include<iostream> #include<cstdio> #include<string.h> #include<math.h> #include<algorithm> using namespace std; int n, W, mx, sum, w[110], v[110], d[10010]; int main() { while(scanf("%d%d", &n, &W) != EOF) { sum = 0; for(int i = 1; i <= n; i++) { scanf("%d%d", &w[i], &v[i]); sum += v[i];//累计所有物品的价值 } for(int i = 1; i <= sum; i++)//初始化d[] d[i] = 10e8; d[0] = 0; for(int i = 1; i <= n; i++) { for(int j = sum; j >= v[i]; j--) { d[j] = min(d[j], d[j-v[i]] + w[i]); // printf("d[%d] = %d d[%d] = %d\n", j, d[j], j-v[i], d[j-v[i]]); } } for(int i = 1; i <= sum; i++) { if(d[i] <= W) mx = i; } printf("%d\n", mx); } return 0; }
相关文章推荐
- NYOJ-860-又见01背包
- NYOJ 860 又见01背包
- Nyoj 860 又见01背包[背包变形]
- NYOJ 860 又见01背包
- NYOJ 860 又见01背包
- NYOJ 860 又见01背包
- nyoj860 又见01背包
- NYOJ 860 又见01背包
- NYOJ860_又见01背包
- NYOJ860 又见01背包
- NYOJ 860 又见01背包
- NYOJ 860 特殊01背包
- NYOJ 860 又见01背包(思维)
- NYOJ 860 又见01背包(01背包转移方程巧用)
- NYOJ 860 又见01背包
- NYOJ 860 又见01背包(01背包)
- NYOJ 860 又见01背包
- NYOJ 题目860 又见01背包(01背包变形)
- 【志银】NYOJ《题目860》又见01背包
- nyoj 860 又见01背包