01背包
有n种不同的物品,每种物品分别有各自的体积 v[i],价值 w[i] 现给一个容量为V的背包,问这个背包最多可装下多少价值的物品。
1 for(int i = 1; i <= n; i++) 2 for(int j = V; j >= v[i]; j--) 3 dp[j] = max(dp[j], dp[j-v[i]]+w[i]); //dp[V]为所求
完全背包
01背包每种物品只能取一个, 完全背包即物品不记件数,可取多件。
1 for(int i = 1; i <= n; i++) 2 for(int j = v[i]; j <= V; j++) //和01背包的不同 3 dp[j] = max(dp[j],dp[j-v[i]+w[i]]);
多重背包
每种物品可取 件数h[i] 已经确定。
1 for(int i = 1; i <= n; i++) 2 for(int j = V; j >= v[i]; j--) 3 for(int k = 0; k <= h[i]; k++) 4 if(j >= k*v[i]) 5 dp[j] = max(dp[j],dp[j - k*v[i]] + k*w[i]);
这样还是都差不多可以理解了,明天再学多重背包的二进制分解优化(看了一下下 好像没看懂 hhhhh
今天就酱啦~ 感觉自己ya 虚度光阴 学了好些时候了的也 今天一直在重复敲模板 希望明天能有进步!
ヾ(?ω?`)o 白白
原文地址:https://www.cnblogs.com/JiaaaaKe/p/9461333.html
时间: 2024-10-03 13:18:54