完全揹包與01揹包的區別在於完全揹包第i件物品可以在允許範圍內選無數個,同樣的v[i]表示體積,w[i]表示價值。
同樣的,我們先從二維入手,較為顯而易見。dp[i][j]表示前i件物品在容量為j的最大價值,那麼相應的也會出現很多情況:
1.不選:dp[i][j]=dp[i-1][j];
2.選一件:dp[i][j]=dp[i-1][j-v[i]]+w[i];
3.選兩件:dp[i][j]=dp[i-1][j-2v[i]]+2w[i];
…->dp[i][j]=max;k>=0;
dp[0]
[0]=
0;for(
int i=
1;i<=n;i++
)//n為物品數}}
cout<[m];
同理我們進行優化,由01揹包的優化過程啟發(本人上篇部落格):我們記得,在化為一維的過程中我們將內層迴圈反向遍歷,目的是為了防止第i件物品的重複計算,因而,在完全揹包的條件下,我們是可以將第i件物品選多次的。因此,我們只需要正向遍歷就ok。
dp[0]
=0;for
(int i=
1;i<=n;i++
)//n為物品數
}cout<;
以上就是完全揹包了,如有錯誤地方還望指出,謝謝! 揹包九講之 01揹包
01揹包是最基礎的揹包問題,其中01代表的就是第i個物品的選或不選,在此先設v i 為體積,w i 為價值。很顯然,我們可以使用二位陣列dp i j 來表示前i個物品在揹包容量為j的時候可存放的最大價值。首先dp 0 0 0是很顯然的。而計算dp i j 時,存在01兩種情況 選或不選第i件物品。1...
揹包學習之揹包九講
做了一些icpc題目,感受到動態規劃的重要性,在此學習揹包 參考至部落格揹包九講 問題 n個物品 體積和價值分別為v i w i 和乙個體積為v的揹包,求揹包裝到的最大價值 狀態陣列 dp i j 為選前i個所用體積為j的最大價值 for int i 1 i n i for int j 1 j v ...
讀揹包九講之二 完全揹包
沒想到完全揹包還有如此神奇的寫法。學習了。還了解了和快速求冪類似的二進位制思想。對於為什麼完全揹包能夠這樣直接從s i 1 到v遍歷可行並且必須這樣,可以從兩個層面理解。一是從抽象的概念角度,也就是文章裡所說的,對於狀態dp j 由於可能多次取到同乙個物品,所以從已經遍歷的方向向未遍歷的方向遍歷是正...