揹包問題 一
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 求...