完全背包
完全背包就是有n个物品,第i(1<= i <= n)个物品的价值为v[i],重量为w[i],可以不限次数的选,问背包容量为m能装的最大价值。
先看看01背包怎么写:
for(int i = n;i >= 1;i--){
for(int j = m;j >= w[i];j--){
dp[j] = max(dp[j],dp[j-w[i]] + v[i]);
}
}
这里只讲空间优化的情况:第二层for循环是倒叙的,因为第i个物品的状态只能由前一个转移,所以不能够由前往后更新,必须先更新后面的。
完全背包呢?01背包不能做的,完全背包可以做。一件物品可以选多次,其实只需要正序更新就好了,只要背包装的下,就可以再次选择这个物品。
for(int i = n;i >= 1;i--){
for(int j = w[i];j <= m;j++){
dp[j] = max(dp[j],dp[j-