01 背包问题
王馨悦 pb10210090
动态规划算法
因为背包最大容量 M 未知。所以,我们的程序要从 1 到 M 一个一个的试。比如,
开始任选 N 件物品的一个。看对应 M 的背包,能不能放进去,如果能放进去,并
且还有多的空间,则,多出来的空间里能放 N-1 物品中的最大价值。怎么能保证
总选择是最大价值呢?看下表。
测试数据:
10,3
3,4
4,5
5,6
c[i][j]数组保存了 1,2,3 号物品依次选择后的最大价值.
这个最大价值是怎么得来的呢?从背包容量为 0 开始,1 号物品先试,0,1,2,的容
量都不能放.所以置 0,背包容量为 3 则里面放 4.这样,这一排背包容量为
4,5,6,....10 的时候,最佳方案都是放 4.假如 1 号物品放入背包.则再看 2 号物
品.当背包容量为 3 的时候,最佳方案还是上一排的最价方案 c 为 4.而背包容量
为 5 的时候,则最佳方案为自己的重量 5.背包容量为 7 的时候,很显然是 5 加
上一个值了。加谁??很显然是 7-4=3 的时候.上一排 c3 的最佳方案是 4.所以。
总的最佳方案是 5+4 为 9.这样.一排一排推下去。最右下放的数据就是最大的价
值了。(注意第 3 排的背包容量为 7 的时候,最佳方案不是本身的 6.而是上一排
的 9.说明这时候 3 号物品没有被选.选的是 1,2 号物品.所以得 9.)
从以上最大价值的构造过程中可以看出。
f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}
我的运行结果