动态规划法—0-1背包问题(二)

来源:互联网 发布:网络小精灵粤语 编辑:程序博客网 时间:2024/06/05 02:59

问题的描述

  假如我们用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表示在背包容量为某个值时,可选项和不可选项。

01

表2表示按物品单位价值比由高到低的顺序考虑问题的最优解。

这里写图片描述

表3表示按物品重量由大到小的顺序考虑。

这里写图片描述

表4表示按物品单位价值比由低到高的顺序考虑。

这里写图片描述

总结

  在上述问题中,我们可以发现,当背包容量为0时,问题属于情况1;容量为1-8时,问题最初属于情况2;容量为9-17时,问题最初属于情况3。而且,通过三个表格的对比,我们发现问题的最优解和我们按何种顺序考虑是没有关系的,最终求得的最优解和最大价值都是一样的。

2 0