01背包和完全背包
题目大意:有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?
每个物品的重量设置为w[i],它的价值设置为c[i]。背包总容量为V。设F[ ] 是每个重量的最大价值。
状态转移方程为 F[i] = max( F[i-1], F[i-w[i]]+c[i] )。
每个物品只能取一次,所以要倒推。最后的结果是F[V]。
核心代码:
for(int i = 1; i <= n; i++){ for(int j = V; w[i] <= j; j--) { f[j] = max(f[j],f[j-w[i]]+c[i]); cout<<j<<" "<<f[j]<<" "; } cout<<endl; }
完全背包的区别是,每个物品可以取无限次。所以直接正推就行了。最后的结果也是F[V]。
核心代码:
for(int i = 1; i <= n; i++){ for(int j = w[i]; j <= V; j++) { f[j] = max(f[j],f[j-w[i]]+c[i]); cout<<f[j]<<" "; } cout<<endl; }