揹包整理 1 01,完全,多重

2021-09-06 14:54:53 字數 1344 閱讀 6503

揹包問題 一   

01揹包:

一般的題目描述是:有n 件物品和乙個容量為v 的揹包。放入第i 件物品耗費的費用是ci,得到的價值是wi。求解將哪些物品裝入揹包可使價值總和最大。         

這是最基礎的揹包問題,特點是:每種物品僅有一件,可以選擇放或不放。         

//

for(i=1 ; i<=n ; i++)

for(j= c[i] ; j<=v; j++)//

注意是從小到大;

dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]]+w[i]);

//則dp[n][v]就是要找的值;

for(i=1 ; i<=n ; i++)

for(j= v; j>=c[i]; j--)//

注意是從大到小;

dp[j]=max(dp[v],dp[v-c[i]]+w[i]);

//則dp[n][v]就是要找的值;

完全揹包:

這個問題非常類似於01揹包問題,所不同的是每種物品有無限件。也就是從每種物品的角度考慮,與它相關的策略已並非取或不取兩種,而是有取0件、取1件、取2件??等很多種。

如果仍然按照解01揹包時的思路,令f[i][v]表示前i種物品恰放入乙個容量為v的揹包的最大權值。

f[i][v]=max

for(int i=1 ; i<=n ;i++)

for(int j=c[i]; j<=v; j++)//

注意:從小到大;

dp[j]=max(dp[j],dp[j-c[i]]+w[i]);

//最後的結果就為;dp[v];

多重揹包:

下面進入關鍵時刻,完全揹包:

另一種好想好寫的基本方法是轉化為01揹包求解:把第i種物品換成n[i]件01揹包中的物品,則得到了物品數為σn[i]的01揹包問題,直接求解,複雜度仍然是o(v*σn[i])。

但是我們期望將它轉化為01揹包問題之後能夠像完全揹包一樣降低複雜度。

仍然考慮二進位制的思想,我們考慮把第i種物品換成若干件物品,使得原問題中第i種物品可取的每種策略——取0..n[i] 件——均能等價於取若干件代換以後的物品。

另外,取超過n[i]件的策略必不能出現。 

方法是:將第i種物品分成若干件物品,其中每件物品有乙個係數,這件物品的費用和價值均是原來的費用和價值乘以這個係數。使這些係數分別為1,2,4,...,2^(k-1),n[i]-2^k+1,    

按照總的價值來分,如果那個商品的數量為1,就按01,揹包,如果是多個,就按完全揹包,來解答;

看看例題吧:   hdu 2844

hud 1059

揹包整理 1 01,完全,多重

揹包問題 一 01揹包 一般的題目描述是 有n 件物品和乙個容量為v 的揹包。放入第i 件物品耗費的費用是ci,得到的價值是wi。求解將哪些物品裝入揹包可使價值總和最大。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。for i 1 i n i for j c i j v j 注意...

01揹包 完全揹包 多重揹包

01揹包 zeroonepack 有n件物品和乙個容量為v的揹包,每種物品均只有一件。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。include include includeusing namespace std const int n 1000 10 int ...

01揹包 完全揹包 多重揹包

01揹包 zeroonepack 有n件物品和乙個容量為v的揹包。每種物品均只有一件 第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。完全揹包 completepack 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是c i 價值是w i 求...