问题的描述
假如我们用C表示最大价值,那么C[n,W]就表示n个物品,在背包容量为W时,背包的最大价值。
在求这个最大价值之前,我们可能会考虑某一子问题的最大价值,用C[i,w]表示,意思是该子问题中,有i个物品,背包的最大容量为w时的最大价值。
三种情况
- 情况1:假如这个子问题中,i=0或w=0,那么c[i,w]=0。
- 情况2:假如在该子问题中,在i个物品当中,有的物品根本就装不进背包(该物品的wi>w),那么根本就谈不到它在背包价值大的还是不在背包价值大,所以直接将该子问题转化成c[i-1,w],即有i-1个物品,容量为w时的最大价值。(注:wi中的角标i和i是含义上是不一样的,教材上在程序实现过程中会把这两个i当成一样的)
- 情况3:假如在这个子问题中,在i个物品当中,有几个物品是能够装入背包的,但是不知道它该不该在背包里。那么对于这种情况就运用上一篇文章写的动态规划方法来解决。(所以我们总是在几个可选项中,决定谁应该选中的情况下,使用动态规划方法)。
按照上篇文章所说,对于情况3,我们先拿出任意一个可选物品考虑它在不在背包里面。
在背包里的总价值:c[i-1,w-wi]+vi
不在背包里的总价值:c[i-1,w]
i-1表示可选物品中,剩下的待考虑的物品个数。
动态规划法的实施
现在,结合具体问题来说明。
物品编号 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
重量 | 3 | 4 | 7 | 8 | 9 |
价值 | 4 | 5 | 10 | 11 | 13 |
举个例子说明。现在背包容量为4,所以要求的问题就是c[5,4],现在我假如要考虑物品4是不是进背包,发现w4>4,属于第二种情况,所以我们求解的问题转化成c[5-1,4](c[4,4])的问题,这里可以看出来,i和wi是不一样的。我们书上一样是因为,每次都按5,4,3,2,1的顺序考虑。接着我们考虑物品5,那么w5>w,所以问题由刚才的c[4,4]变成了c[4-1,4]的问题(c[3,4])。同理,当你考虑物品3的时候,也是这样。
更直接地说,因为当背包容量为5时,因为就两个可选的物品,物品1和物品2,所以我们要求解的问题c[5,4]就可以转化成c第三种情况的[2,4]的问题,这时如果我们先考虑1在不在背包里,就是c[2-1,4-3]+4和c[2-1,4]即c[1,1]+4和c[1,4]。然后在分别对两种情况下的子问题,考虑物品2在背包里。对于c[1,1]这个子问题,物品4放不进去,该子问题就转换成c[0,1]这个子问题,这个子问题可以直接算出解为0;对于c[1,4]这个子问题,物品2在不在背包里面就是c[0,0]+5和c[0,4]。
c[5,4]->c[4,4]->c[3,4]->c[2,4]->Max(c[1,1]+4,c[1,4])
按上述顺序求解,如图所示:
现在来解决背包容量为17的问题,从背包容量为0的时候开始考虑。见下面4张表:
表1表示在背包容量为某个值时,可选项和不可选项。
表2表示按物品单位价值比由高到低的顺序考虑问题的最优解。
表3表示按物品重量由大到小的顺序考虑。
表4表示按物品单位价值比由低到高的顺序考虑。
总结
在上述问题中,我们可以发现,当背包容量为0时,问题属于情况1;容量为1-8时,问题最初属于情况2;容量为9-17时,问题最初属于情况3。而且,通过三个表格的对比,我们发现问题的最优解和我们按何种顺序考虑是没有关系的,最终求得的最优解和最大价值都是一样的。