当要求背包必须装满时,求背包能获得的最大价值
int n=10;
int v[3] = {4,5,6};
int p[3] = {10, 17, 16};
int dp[11];
for(int i=1; i<=n; i++)
dp[i] = -INF;
dp[0] = 0;
for(int i=0; i<3; i++) {
for(int j=n; j>=v[i]; j--) {
dp[j] = max(dp[j], dp[j-v[i]]+p[i]);
}
}
这是的dp[0]=0,其他值为什么赋值为负无穷?
可以从代码中看到dp[j-v[i]]+p[i],因为我们是从n倒着往前放的,除非j-v[i]==0,这是dp[j-v[i]]+p[i]的值为0+p[i],这说明此时的这个物品i恰好能够装满容量为j的背包,所以此时dp[j]的值才是有效值,为p[i]。也就是说只要放进去的物品能够刚好装满背包,此时背包里面的值才是有效值,否则都为负无穷。