【演算法】動態規劃解決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)。
因為為了表示這個物品裝進揹包裡了,即:揹包容量變小了。