苹果
时间限制:3000 ms | 内存限制:65535 KB
难度:3
-
描述
-
ctest有n个苹果,要将它放入容量为v的背包。给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值。
-
输入
- 有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n、v同时为0时结束测试,此时不输出。接下来的n行,每行2个正整数,用空格隔开,分别代表苹果的大小c和价钱w。所有输入数字的范围大于等于0,小于等于1000。 输出
- 对每组测试数据输出一个整数,代表能放入背包的苹果的总价值。 样例输入
-
3 3 1 1 2 1 3 1 0 0
样例输出 -
2
-
附上讲的比较好的01背包http://blog.youkuaiyun.com/a_eagle/article/details/7080111
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; int main() { int n, vv, v[1001], w[1001], i, j, dp[1001]; while(~scanf("%d%d", &n, &vv) && n != 0 && vv != 0) { for(i = 0; i < n; i++) { scanf("%d%d", &v[i], &w[i]); } memset(dp, 0, sizeof(dp)); for(i = 0; i < n; i++) { for(j = vv; j >= v[i]; j--) { if(dp[j] < dp[j - v[i]] + w[i]) { dp[j] = dp[j - v[i]] + w[i]; } } } printf("%d\n", dp[vv]); } return 0; }
下面是没有优化的二维数组的解法
-
//nyoj289 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int dp[1005][1005], c[1005], w[1005]; int main() { int n, v, i, j; while(~scanf("%d%d", &n, &v) && n != 0 && v != 0) { memset(dp, 0, sizeof(dp)); memset(c, 0, sizeof(c)); memset(w, 0, sizeof(w)); for(i = 1; i <= n; i++) { scanf("%d%d", &c[i], &w[i]); } for(i = 1; i <= n; i++) { for(j = 1; j <= v; j++) {//这里j不能从c[i]开始,否则前面的那部分就没有初值,切记 dp[i][j] = dp[i - 1][j];//这是二维不优化的地方,这些地方也要考虑到,不然一直error if(j >= c[i]) { if(dp[i - 1][j] < dp[i - 1][j - c[i]] + w[i]) { dp[i][j] = dp[i - 1][j - c[i]] + w[i]; } else { dp[i][j] = dp[i - 1][j]; } } } } printf("%d\n", dp[n][v]); } return 0; }