【算法】动态规划解决0-1背包的三个疑惑及思路

1. 背包问题

描述: 给定 n 种商品,每种商品有对应的重量weight和价值value,一个容量为 maxWeight 的背包,问:应该如何选择装入背包的商品,使得装入背包中的商品的总价值最大?

过程

  a) 把背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个商品选或不选),Vi表示第 i 个商品的价值,Wi表示第 i 个商品的体积(重量);

  b) 建立模型,即求max(V1X1+V2X2+…+VnXn);

  c) 约束条件,W1X1+W2X2+…+WnXn<capacity;

  d) 定义V(i,j):当前背包容量 j,前 i 个商品最佳组合对应的价值;

案例:number=4,capacity=8

i

1

2

3

4

w(体积)

2

3

4

5

v(价值)

3

4

5

6

第一个疑惑(solved):

既然j表示容量,为什么在大多数文章中,j=1,2,3,...n,而不是与重量有关的数列?

答:分解为小问题后,就变成了更小容量的问题,所以j由小到大地生长,看能放商品情况。这里没毛病。

2. 递推关系

寻找递推关系式,面对当前商品有两种可能性:

第一,包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j);

第二,还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j)=max{ V(i-1,j),V(i-1,j-w(i))+v(i) }

其中V(i-1,j)表示不装,V(i-1,j-w(i))+v(i) 表示装了第i个商品,背包容量减少w(i)但价值增加了v(i);

由此可以得出递推关系式:

    1) j<w(i)      V(i,j)=V(i-1,j)

    2) j>=w(i)     V(i,j)=max{ V(i-1,j)V(i-1,j-w(i))+v(i) 

第二个疑惑(solved):

为什么会出现V(i-1,j-w(i)),尤其是其中的j-w(i)。

因为为了表示这个商品装进背包里了,即:背包容量变小了。

如果物品重量为小数,那么寻优过程中的“j-w(i)就要找不大于j的最大整数。

3. 找出解的具体形式

经过递推关系式,可以得到一张类似如下的图表

第三个疑惑(solved):

如何从图中找出最终的背包商品?

答:表格填完,要根据最优解回溯找出解的组成。寻解方式如下:

1) V(i,j)=V(i-1,j)时,说明没有选择第i 个商品,则回到V(i-1,j);(备注:竖着的两个值相等,没选商品i —> 跳到i-1

2) V(i,j)=V(i-1,j-w(i))+v(i)时,说明装了第i个商品,该商品是最优解组成的一部分,随后我们得回到装该商品之前,即回到V(i-1,j-w(i));(备注:竖着两个值不等,选了商品i —> 按重量跳到不装商品i的那个j的位置

3) 一直遍历到i=0结束为止,所有解的组成都会找到。

举例说明

1) 最优解为V(4,8)=10,而V(4,8)!=V(3,8)却有V(4,8)=V(3,8-w(4))+v(4)=V(3,3)+6=4+6=10,所以第4件商品被选中,并且回到V(3,8-w(4))=V(3,3);

2) 有V(3,3)=V(2,3)=4,所以第3件商品没被选择,回到V(2,3);

3) 而V(2,3)!=V(1,3)却有V(2,3)=V(1,3-w(2))+v(2)=V(1,0)+4=0+4=4,所以第2件商品被选中,并且回到V(1,3-w(2))=V(1,0);

4) 有V(1,0)=V(0,0)=0,所以第1件商品没被选择;

发布了392 篇原创文章 · 获赞 492 · 访问量 241万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览