1. 程式人生 > >動態規劃—0-1揹包問題

動態規劃—0-1揹包問題

       演算法是對特定問題求解步驟的一種描述,或定義解決某問題的規則,演算法的設計和實現體現了計算機破解過程。演算法的設計也是一種思想和智慧的結晶,常用的演算法設計技術主要有分治法、動態規劃法、貪心法、回溯法和分支界限法。其中分治思想貫徹各個演算法,分治,分而治之,即將複雜問題分解成一系列子問題,遞迴的求解各子問題,然後合併子問題的解即原問題的解。其中分解的子問題是相互獨立,且是原問題的較小模式。對幾種演算法的學習都拿揹包問題來分析研究,其中動態規劃和回溯法都屬於0-1揹包,而貪心演算法屬於部分揹包問題。貪心演算法即按著物品的單位價值由大到小往揹包中放物品,物品可拆分,直到揹包放滿為止,得到的一定是當前的最後解。主要介紹動態規劃和回溯法在

0-1揹包中的應用。

問題描述:

       有n種物品和一個重量為W的揹包,第i種物品的重量是w[i],價值是v[i]。求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包重量,且物品總價值價值最大。假設n=5W=17

求解步驟:

1、刻畫0-1揹包最優解結構;

如果有n個物品,用Xi表示第i個物品的狀態。Xi 的值為0或1。0表示物品未進入揹包,1表示物品進入揹包。

如果一個最優解中包含n,即Xn=1,那麼其餘X1X2,…,X(n-1)一定構成子問題1,2,…,(n-1)在容量W-wi的最優解。如果Xn=0,則構成在W時的最優解。

2、遞迴定義最優解的值;

c[ i,w ]表示揹包容量為w

i個物品導致的最優解的總價值。得到下式:


第一種情況:i=0w=0分別表示放入的物品個數為0,揹包容量為0,此時談不上物品的總價值。

第二種情況:wi>w表示第i個物品的重量大於揹包的重量,此時i放不進去,構成在i-1上的最優解的問題。

第三種情況:表示物品i可以放入,此時求總價值最大有兩種情況:i在包中,總價值為c[i-1,w-wi]+vii不在包中,同第二種情況,轉換為在i-1上的最優解問題,即c[i-1w]

3、計算揹包最優解的值。

       由上述公式,考慮一個問題的最優解必須依賴前一個子問題的最優解,所以我們從揹包容量為0開始考慮,逐漸增大揹包容量,體現一個動態的過程,而考慮在可選物品是否應該放入揹包中時,我們先拿一個物品是否在不在,然後在此基礎上考慮另一個物品在不在,在比較在或不在求最大價值體現規劃的過程。

表示揹包容量動態變化過程中,物品是否可以放入,1表示放入,*表示不能放入。


表示物品按單位價值比順序考慮問題最優解。

 

使用場景:

        最優子結構:如果一個問題的最優解中包含子問題的最優解,就說該問題具有最優子結構。當然一個問題具有最優子結構時貪心也可能適用。

重疊子問題:對每個子問題僅計算一次,把解儲存在一個在需要時可以檢視的表中。

對比分治法:

       待解問題也分解成若干子問題,但子問題都不獨立,用一個表來記錄所有已解決子問題的答案,不管子問題是否被用到,只要計算過,就將其結果填入表中。