n种物品,每种物品只有一个。第i种物品的体积为Vi,重量为Wi。选一些物品撞倒一个容量为C的背包,使总体积不超过C时重量尽量大。
代码1:
for (int i = n; i >= 1; i--)
for (int j = 0; j <= c; j++){
d[i][j] = (i == n ? 0 : d[i+1][j]);
if(j >= V[i]) d[i][j] = max(d[i][j],d[i+1][j-V[i]]+W[i]);
}
答案为d[1][C]。
代码2(用f(i,j)表示“把前i个物品装到容器为j的背包中的最大总重量”):
for (int i = 1; i <= n; i++)
for (int j = 0; j <= c; j++){
f[i][j] = (i == n ? 0 : f[i-1][j]);
if(j >= V[i]) f[i][j] = max(f[i][j],f[i-1][j-V[i]]+W[i]);
}
代码3(边读边计算):
for (int i = 1; i <= n; i++){
scanf("%d%d",&V,&W);
for (int j = 0; j <= c; j++){
f[i][j] = (i == n ? 0 : f[i-1][j]);
if(j >= V) f[i][j] = max(f[i][j],f[i-1][j-V]+W);
}
}
代码4(滚动数组):
memset(f, 0, sizeof(f));
for(int i = 1; i <= n; i++){
scanf("%d%d",&V,&W);
for (int j = C; j >= 0; j++)
if(j >=V) f[j] = max(f[j], = f[j - V] + W);
}