完全揹包問題

2021-08-17 22:22:57 字數 1804 閱讀 9880

前面分析過01揹包問題。01揹包:在m件物品中取出若干件物品放到揹包中,每件物品對應的體積v1,v2,v3,....對應的價值為w1,w2,w3,,,,,每件物品最多拿一件。

解決方法是 動態規劃

決策是:第i件物品放或者不放

由此得到狀態轉移方程:

f[i,j] = max

f[i,j]表示前i件物品中選擇若干件放在所剩空間為j的揹包中。wi表示第i件物品的體積。pi表示第i件物品的價值。

上述方程可優化為一維陣列表示式:

n是物品種類數,v是揹包容量,c[i]是物品i的體積,w[i]是物品i的價值,f[v]是容量為v的揹包在前i件物品中取得的最大價值
for(int i=1;i<=n;++i)

上面的偽**和01揹包不同之處只有v的迴圈次序不同。

為什麼01揹包要按照v的逆序來迴圈。正是為了保證每件物品i只選擇一次。為了保證在考慮「選入第i件物品」這件策略時,依據的是乙個沒有已經選入第i件物品的子結果f[v-c]。

然而,完全揹包的特點恰是每種物品可選無限件,所以,必須採用v的順序迴圈。

完全揹包:

有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。

第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。這裡不同之處是每件物品可無限取,這裡就產生了很多可行的優化,比如同體積的有多種物品,則必然可以捨棄價值小的,也可以捨棄體積大於v的。

直接說題意,完全揹包定義

有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。

第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包

恰好裝滿揹包時,求出最大價值總和是多少。如果不能恰好裝滿揹包,輸出no輸入

第一行: n 表示有多少組測試資料(n<7)。 

接下來每組測試資料的第一行有兩個整數m,v。 m表示物品種類的數目,v表示揹包的總容量。(0輸出

對應每組測試資料輸出結果(如果能恰好裝滿揹包,輸出裝滿揹包時揹包內物品的最大價值總和。 如果不能恰好裝滿揹包,輸出no)

樣例輸入

21 52 2

2 52 2

5 1

樣例輸出                                      

no 1

強調一點:

這裡唯一不同的是揹包如果不能完全裝滿,則輸出no,

這裡需要乙個技巧

,就是初始化時f[0]=0,其餘的均為-max(初始化乙個大的負數)

,只有這樣最大值為正時,只能通過f[0]在相加其他價值得到,如:

揹包體積為4時, 一種物品體積2,價值2;  則   f[0]=0; f[1]=-max; f[2]=max(f[2],f[0]+w[i])=2; 注意若揹包不需要全部裝滿時,f[3]本該為2的,但此時f[3]=max(f[3],f[1]+2)=max(f[3],2-max)=2-max; 負無窮。最後結果就是如果f[v]是負值表示,揹包不能完全裝滿,需要輸出no。如果為正值,表示揹包可以裝滿輸出結果即可。

如果很難理解,可以看程式,程式一步一步看,更容易理解。

#include#include#include#includeusing namespace std;  

int f[50010], c[2010], w[2010];

int main()

}

另外,還有一種完全揹包題型:是揹包不需要裝滿,輸出最大值,此時只需要把f[n]全部初始化為0即可,不需要初始化除f[0]外,其他值為最大負數。

揹包問題(完全揹包)

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...