1. 程式人生 > >【演算法】動態規劃解決0-1揹包的兩個疑惑

【演算法】動態規劃解決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 個物品最佳組合對應的價值;

第一個疑惑(unsolved):

為什麼常見的文章中,j=1,2,3,...n,是有序數列,而不是與重量有關的隨機數列。

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)。

因為為了表示這個物品裝進揹包裡了,即:揹包容量變小了。