约 10 分钟
注意 dp[i] 只用到 dp[i-1],可以只用一维数组 dp[j]。01 背包要让内层容量从大到小枚举,保证每个物品只被用一次:for(int i=1;i<=n;i++) for(int j=W;j>=w[i];j--) dp[j]=max(dp[j], dp[j-w[i]]+v[i]);。
dp[i]
dp[i-1]
dp[j]
for(int i=1;i<=n;i++) for(int j=W;j>=w[i];j--) dp[j]=max(dp[j], dp[j-w[i]]+v[i]);
如果内层改成从小到大,会出现什么错误?
登录 后可看答案