揹包問題總結

0-1揹包問題

給定N種物品和一個揹包,第i個物品的價值爲vi,重量爲wi,每個物品只能選擇放入揹包或者不放入揹包,揹包承重爲c,求使得揹包中物品價值最大的放法。

解法:動態規劃

定義狀態:c[i][m]表示考慮第i件物品( 1<=i<=n )放入與否時,揹包容量(這裏的容量就是指總容量,並不是指還能裝的重量,而是包含揹包中已經裝了物品的和沒裝物品的部分,可以把揹包想成由很多小揹包組成)爲m的狀態下,可以獲得的最大價值。

C[ i ][ m ] = max{ c[ i-1 ][ m ], c[ i-1 ][ m-wi ]+vi }                     1<i<n && m>=wi

                = c[ i-1 ][ m ]                                                                1<i<n && m<wi

C[ 0 ][ m ] = 0;

c[ i-1 ][ m ]表示第i件物品沒有放入揹包狀態下揹包價值, c[ i-1 ][ m-wi ]+vi 表示第i件物品放入了揹包狀態下揹包價值。

 

**0-1揹包問題還有一種變種,就是要求揹包必須裝滿狀態下達到最高價值:這隻需在初始化狀態下做改變即可。

 1 不需要裝滿條件下,C[0][x] (0<=x<=c)全部初始化爲0

 2 只能裝滿條件下,C[0][0]=0, C[0][i]( 1<=i<=c )初始化爲 -∞,這樣就使得當前揹包沒有裝滿的策略價值都是-∞

 

 

揹包問題

0-1揹包問題相類似,但不同的是在選擇物品i時,可以一部分裝進揹包,不一定全部裝入揹包。

0-1揹包問題 與 揹包問題 都具有最優子結構性質;但是揹包問題可以用貪心算法,0-1揹包則不行。

解法:首先計算每件物品單位重量的價值vi/wi,然後依照貪心選擇策略,將儘可能多的單位重量價值最高的物品放入揹包。如果放完揹包還有剩餘,就放單位重量價值次高的物品。

 

完全揹包問題

給定N種物品和一個揹包,第i個物品的價值爲vi,重量爲wi,每個物品可以選擇放0個,1個...n個到揹包中,揹包承重爲c,求使得揹包中物品價值最大的放法。

解法:由於完全揹包問題也滿足最優子結構,並且有重複子結構,所以使用動態規劃的方法

定義狀態:c[i][m]表示考慮第i件物品( 1<=i<=n )時,揹包容量(這裏的容量就是指總容量,可以把揹包想成由很多小揹包組成)爲m的狀態下,可以獲得的最大價值。

C[i][m] = max{ c[ i-1 ][ m-k*wi ] + k*vi  |  0<=k*wi<=c } 

C[0][m] = 0

 

如果要裝滿一個重量剛好爲value的揹包,已知每種重量物品的數量。

可以假設每種物品的價格都爲1,這樣就轉化爲一定要裝滿揹包的完全揹包問題。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章