完全揹包問題的優化

2021-10-11 22:46:26 字數 1178 閱讀 4301

有 n 種物品和乙個容量為 v 的揹包,每種物品都有無限件可用。放入第 i 種物品的體積是 ci,價值是 wi。求將哪些物品裝入揹包,可使這些物品的耗費的費用總和不超過揹包容量,且重量總和最大。

首先,要將 ci 大於 v 的物品剔除。

其次,對於任意正整數 i 和 j,如果有 ci ≤ cj 且 wi ≥ wj,那麼可以去掉編號為 j 的物品

比較0-1揹包和完全揹包,會發現不同點在於每種揹包的數量,01揹包是每種只有一件,完全揹包是每種無限件。

完全揹包動態規劃過程:

根據第i種物品放多少件進行決策,所以狀態轉移方程為:

其中f[i-1][j-kc[i]]+kw[i]表示前i-1種物品中選取若干件物品放入剩餘空間為j-k*c[i]的揹包中所能得到的最大價值加上k件第i種物品;

這樣**應該是三層迴圈(物品數量,物品種類,揹包大小這三個迴圈),很明顯,這樣一般情況下會超時,需要轉化成時間複雜度比較低的在進行求解。可以嘗試著簡化為一維陣列來求解。

完全揹包比照 01 揹包問題可以得到:

dp[j] = max

左邊的 dp[j] 表示對第 i 輪計算 dp[j] 表示本輪計算中放入容量為 j 的揹包中物品重量之和的最大值,右邊的則表示上一輪計算得到的最大值

那麼,最終可以得到演算法偽**:

void completepack(cost, weight)

for i = cost … v

dp[i] = max(dp[i], dp[i - cost] + weight)

這樣,右邊的 dp[i] 表示本輪計算不放入當前待算物品,也就是上一輪計算的結果;而 dp[i - cost] 則表示本輪計算在容積 i - cost 的結果已經計算出來後,再多放入乙個本輪物品的計算結果,即保證至少放入乙個本輪物品。

注意:dp[i - cost] 並不意味著只允許放入乙個當前物品,因為:和 01 揹包不同,01揹包迴圈是從右向左進行,而完全揹包迴圈是從左向右進行的,所以如果要放入乙個以上的當前物品,則必定包含在 dp[i - cost] 的計算情況中,無需再算。(加粗句段是關鍵)

簡單**:

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

for(int j=c[i]; j<=v; j++)//注意此處,與0-1揹包不同,這裡為順序,0-1揹包為逆序

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

揹包問題(完全揹包)

1.矩陣鏈乘法 2.投資組合問題 3.完全揹包問題 4.01揹包問題 5.最長公共子串行 乙個揹包,可以放入n種物品,物品j的重量和價值分別為,如果揹包的最大重量限制是b,怎麼樣選擇放入揹包的物品以使得揹包的總價值最大?組合優化問題,設表示裝入揹包的第j個物品的數量,解可以表示為。那麼目標函式和約束...

完全揹包問題

這個是從ppt上弄過來的。完全揹包問題 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。放入第i種物品的耗費的空間是ci,得到的價值是wi。求解 將哪些物品裝入揹包,可使這些物品的耗費的空間總和不超過揹包容量,且價值總和最大 基本思路 這個問題非常類似於01揹包問題,所不同的是每種物品有無限...

完全揹包問題

設有n種物品,每種物品有乙個重量及乙個價值。但每種物品的數量是無限的,同時有乙個揹包,最大載重量為m,今從n種物品中選取若干件 用乙個物品可以多次選取 使其重量的和小於等於m,而價值的和為最大。輸入有多組資料,對於每組輸入資料第1行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第2...