完全揹包不同於01揹包-完全揹包裡面的東西數量無限
假設現在有5種物品重量為5,4,3,2,1
價值為1,2,3,4,5
揹包容量為10
1 #include 2 #include3其他都和01揹包一樣,就是遍歷j時候的初始化不一樣。4using
namespace
std;
5int
main() 6;
9int v[6] = ;
10int dp[11] = ;
11for (int i = 1; i <= 5; i++)
12for (int j = w[i]; j <= 10;j++)
13 dp[j] = max(dp[j],dp[j - w[i]] +v[i]);
14 cout << "
總的價值為:
"<< dp[10] <
15return0;
16 }
這裡的dp[j]還是表示前i件物品放入乙個為j容量的揹包獲得的最大價值,每次更新必然保證是當前最優解。就像求最長遞增子串行一樣。都是把所有情況過一遍然後拿最大的結果。
不多講直接推算幾步就全懂了。
1)首先是當只有物品1號的時候,j初始化為1號物品的重量為5
dp[5]=max(dp[5],dp[5-5]+1]=1
dp[6]到dp[9]都是1,dp[10]=2
2)然後現在是有物品1號和2號,j初始化為2號物品重量4
dp[4]=max(dp[4],dp[4-4]+2)=2
dp[5]=max(dp[5],dp[5-4]+2)=2
dp[..8]=max(dp[8],dp[8-4]+2)=4
其實到這裡也差不多了,下面都是一樣的。
我們要決定是不是要放這個物品,就從這個物品的大小出發遍歷揹包容量,然後每次遍歷都對比下假如現在騰出這個物品的空間並且放進去比原來的價值還大的話,就放進去。
區別------------01揹包和完全揹包
01揹包遍歷是反向的,這樣更新就不會影響前面的。
而完全揹包正向遍歷,會改變前面的所以也就可出現多次存放的了。
多重揹包再加點限制,數量有限制。
資料如下
同樣設揹包為10大小
**如下:
1 #include 2 #include3這次不一步步來了,懂01就可以了。using
namespace
std;
4int
main()5;
8int v[6] = ;
9int cot[6] = ;
10int dp[11] = ;
11for (int i = 1; i <= 5; i++)
12for (int k = 1; k <= cot[i];k++)
13for (int j = 10; j >= w[i]; j--)
14 dp[j] = max(dp[j], dp[j - w[i]] +v[i]);
15 cout << "
總的價值為:
"<< dp[10] <
16return0;
17 }
因為每次01都是放乙個而完全揹包是放多個,我們也不知道完全 揹包放了幾個。所以多重揹包算是01揹包的變種。
既然我們每次遍歷都是判斷放不放這乙個物品,那我們乾脆就有幾個就遍歷幾遍。再遍歷外面再加乙個for就好了
很好理解。
揹包問題(完全揹包)
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...