情景預設:
完全揹包是在i件物品取出若干件放在空間為j的揹包裡,第i件物品的重量為t[i],與之相對應的價值為v[i]。
完全揹包的約束條件是給定幾種物品,每種物品有無數個。
在完全揹包問題中,因為每種物品有無數個,對於每個物只需要考慮放幾個的情況。
這個情境下的題目要求是:選取哪些物品並且確定噶書可以在不超過揹包最大承載質量下滿足最大的價值要求。
方程如下:
dp[i][v] = max
方程表示的是在dp[i-1][v-k*t[i]] + k*v[i]中價值滿足最大的k取到的最大價值。
讓我假設現在的揹包的容量是c=10;
物品編號: 1 2 3
物品重量: 5 6 4
物品價值:20 10 12
分析過程:
dp:0 0 0 0 0 0 0 0 0 0
i=1:
dp[5] = max(dp[0]+20, dp[5]);
dp[6] = max(dp[1]+20, dp[6]);
dp[7] = max(dp[2]+20, dp[7]);
dp[8] = max(dp[3]+20, dp[8]);
dp[9] = max(dp[4]+20, dp[9]);
dp[10] = max(dp[5]+20, dp[10]);
小於5的放不進去,5到10的全都放進去了。
dp:0 0 0 0 20 20 20 20 20 40
i=2:
dp[6] = max(dp[0]+10, dp[6]);
dp[7] = max(dp[1]+10, dp[7]);
dp[8] = max(dp[2]+10, dp[8]);
dp[9] = max(dp[3]+10, dp[9]);
dp[10] = max(dp[4]+10, dp[10]);
重複操作。
dp:0 0 0 0 20 20 20 20 20 40
i=3;
dp[4] = max(dp[0]+12, dp[4]);
dp[5] = max(dp[1]+12, dp[5]);
dp[6] = max(dp[2]+12, dp[6]);
dp[7] = max(dp[3]+12, dp[7]);
dp[8] = max(dp[4]+12, dp[8]);
dp[9] = max(dp[5]+12, dp[9]);
dp[10] = max(dp[6]+12, dp[10]);
重複操作。
dp:0 0 0 12 20 20 20 20 32 40
例題如下:
sdnu-oj-1043
description
***上山去採藥。***有乙個容量為m(1<=m<=1000)的揹包,他所採集的藥材的總重量不能大於揹包的容量。已知共有n(1<=n<=1000 )種藥材,每種藥材都有無限多,並且知道每種藥材的重量w(1<=w<=m)及價值v(1<=v<=100000),如何選擇,才能使得採到的藥材的總價值最大?
input
第1行為兩個整數m和n,分別為揹包的容量及藥材的種數。 第2至n+1行每行兩個整數w和v,分別表示每種藥材的重量及價值。
output
能採到的藥材的最大總價值
sample input
100 5
77 92
33 50
34 60
50 46
99 161
sample output
161關鍵**如下:
for(int i = 0; i < m; i++)
}}
完整**:
#include
#include
#include
using
namespace
std;
int main()
; for(int i = 0; i < m; i++)
for(int i = 0; i < m; i++)}}
cout
<< dp[time] << endl;
}return
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...