完全揹包dp

2021-08-31 03:53:45 字數 2068 閱讀 2157

完全揹包類似題目(不過求最小值):杭電1114

《揹包九講》

基本形式: 有 n 種物品和乙個容量為 v 的揹包,每種物品都有無限件可用。放入第 i 種 物品的費用是 c i ,價值是 w i

。求解:將哪些物品裝入揹包,可使這些物品的耗 費的費用總和不超過揹包容量,且價值總和最大。

基本思路: 這個問題非常類似於01揹包問題,所不同的是每種物品有無限件。也就

是從每種物品的角度考慮,與它相關的策略已並非取或不取兩種,而是有 取 0 件、取 1 件、取 2 件……直至取 ⌊v /c i ⌋

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

的揹包的最大權值。仍然可以按照每種物品不同的策略寫出狀態轉移方 程,像這樣: f[i,v] = max

o(v n) 的演算法 這個演算法使

用一維陣列,先看偽**: f[0…v ]←0 for i ← 1 to n for v ← c i to

v f[v] ← max (f[v],f[v − c i ] + w i ) 你會發現,這個偽**與01揹包問題的偽**只有 v

的迴圈次序不同而已。 為什麼這個演算法就可行呢?首先想想為什麼01揹包中要按照 v 遞減的次序來 迴圈。讓 v 遞減是為了保證第 i

次迴圈中的狀態 f[i,v] 是由狀態 f[i − 1,v − c i ] 遞

推而來。換句話說,這正是為了保證每件物品只選一次,保證在考慮「選入 第 i 件物品」這件策略時,依據的是乙個絕無已經選入第 i

件物品的子結果 f[i − 1,v − c i ] 。而現在完全揹包的特點恰是每種物品可選無限件,所以在考慮「加 選一件第 i

種物品」這種策略時,卻正需要乙個可能已選入第 i 種物品的子結 果 f[i,v − c i ] ,所以就可以並且必須採用 v

遞增的順序迴圈。這就是這個簡單的 程式為何成立的道理。

值得一提的是,上面的偽**中兩層for迴圈的次序可以顛倒。這個結論有 可能會帶來演算法時間常數上的優化。

這個演算法也可以由另外的思路得出。例如,將基本思路中求解 f[i,v−c i ] 的

狀態轉移方程顯式地寫出來,代入原方程中,會發現該方程可以等價地變形成 這種形式: f[i,v] = max (f[i −

1,v],f[i,v − c i ] + w i ) 將這個方程用一維陣列實現,便得到了上面的偽**。

最後抽象出處理一件完全揹包類物品的過程偽**: def completepack( f,c,w ) for v ← c to v f[v]

← max

個人理解: 與01揹包相比,內層迴圈重量從0正向遍歷到m正是為了使每乙個物品都可以在無限次加入揹包(在不超過揹包承載重量的前提下)。

1、空間複雜度v(n*m)

#include#includeusing namespace std;

int n; //物品的個數

int m; //揹包的最大容量

int value[1005]; //物品的價值

int weight[1005]; //物品的重量

int dp[1005][1005] //dp陣列

/*完全揹包

空間複雜度為v(n*m)的演算法

*/void init() //初始化函式

void completepack() //解決揹包問題的函式

else dp[i][j]=dp[i-1][j]; //否則等於上乙個狀態

} }}int main() //主函式

void completepack() //解決揹包問題的函式

}}int main() //主函式

solve();

if(dp[m]==1000000) cout<<"this is impossible."

}

DP完全揹包

written with stackedit.每件物品不限數量 轉化為0 1揹包 每個物體盡可能多放 why?遞推式為 f i j max,kw i wf i,j max forall kw i f i,j max kw i w其他思路和01揹包相同.檢查每乙個k不會造成越界的k.0 1揹包就是完全...

dp 完全揹包)

有 n n n 種物品和乙個容量是 v v v 的揹包,每種物品都有無限件可用。第 i i i 種物品的體積是 v i vi vi,價值是 w i wi wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v n,v n,v,用...

完全揹包 貪心 dp

考慮以下問題 有n nn種物品,第i ii種有z iz i zi 個,價值是y iy i yi 重量是w iw i wi 那麼把這些物品放入大小為x xx的揹包,的最大價值是多少 n,yi 50 wi,z i 10 9 n,y i leq 50 w i,z i leq 10 9 n,yi 50w i...