完全揹包問題(3)

2021-09-25 16:44:36 字數 1186 閱讀 6068

有n種物品,揹包容積為m。每種物品都有對應的體積和價值,分別為w和d。每個物品可以取多次,其他參見01揹包問題,01揹包問題每種物品至多可以取1次,其他和完全揹包問題一樣。

通俗來講,假設小黑去超市購物,購物車大小一定,每個商品的價值和大小都不一樣,問怎樣裝購物車裝滿的情況下物品總價值最大。01揹包問題就是每種物品至多拿乙個,而完全揹包問題是每種物品可以拿多個。

#include #include using namespace std;

struct good;

void test()

for(int i = 0;i <= m;i++)

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

}cout《分析思路和01揹包問題一樣,唯一不同的是完全揹包問題的物品可以取多次或者不取。內層迴圈遍歷是,要從小到大for(int i = 1;i <= m;i++)。

分析一下極端情況,假設有三個物品,(1,10),(2,10),(3,10),分別代表三個物品的體積和價值,揹包的容積是3,則在01揹包問題種,最大價值為20(分別取第1和第2個物品),而在完全揹包問題種,價值最大為30(第1個物品取三次,價值達到最大)。

1 完全揹包問題時,內層迴圈(即遍歷揹包容積時)按照公升序排列,揹包容積在較小時已經被更新,到揹包容積較大時,因為有f[j] = max(f[j], f[j - goods[i].w]+goods[i].d),則此時的揹包價值再次增大,相當於外層迴圈的第i個物品被再次新增進來,也就是預設了乙個物品可以被新增多次,剛好滿足完全揹包問題的情況。

2 01揹包問題時,內層迴圈按降序排列,揹包的容積從大到小進行遍歷,當揹包容積較大時,f[j] = max(f[j], f[j - goods[i].w]+goods[i].d),若將第i個物品新增進來,則訪問第f[j-goods[i].w],需要容積較小時的揹包來確定容積較大時的揹包,此時揹包由大到小,容積小的還沒有被更新,也就是還沒有新增第i個物品,而到容積較小時,價值可由更小容積的揹包確定,而較大容積的揹包不會影響到較小揹包。總之,這樣就保證了第i個物品至多被新增一次,剛好滿足01揹包問題的條件。

3 總之,在遍歷揹包的不同容積時,較大容積的價值受較小容積的價值影響,若由小到大遍歷,對於第i個物品,可以多次更新較大容積的揹包,相當於第i個物品被新增了多次,符合完全揹包問題;若由大到小遍歷,小揹包不會受到大揹包價值的影響,這樣保證了第i個物品至多影響一次揹包價值的更新,也就相當於第i個物品至多被新增一次,符合01揹包問題。

揹包問題(完全揹包)

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

3 完全揹包

完全揹包問題 狀態轉移方程 物品拆分 一維狀態 1 完全揹包問題 有乙個容量為v的揹包和n種物品,第i種物品的體積是c i 價值是w i 每種物品都有無限件可用,求將哪些物品裝入揹包使得價值總和最大。2 狀態轉移方程 對於第i件物品,01揹包的關鍵在於取或不取,而完全揹包就有取0件 1件 k件 k ...

完全揹包問題

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