完全揹包問題

2021-10-25 13:45:19 字數 1495 閱讀 6421

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

第 i 種物品的體積是 vi,價值是 wi。

求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。

輸出最大價值。

第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。

接下來有 n 行,每行兩個整數 vi,wi,用空格隔開,分別表示第 i 種物品的體積和價值。

輸出乙個整數,表示最大價值。

0演算法:動態規劃(dp)

#include#include#include#includeusing namespace std;

const int n = 1010;

int f[n][n], v[n], w[n];

int main()

我們列舉一下更新次序的內部關係:

由上式可得:f[ i ][ j ] = max( f[ i - 1][ j ], f[ i ][ j - v] + w)

故可得優化版**:

#include#include#include#includeusing namespace std;

const int n = 1010;

int f[n][n], v[n], w[n];

int main()

cout << f[n][m] << endl;

return 0;

}

由上述**可以發現,其**段與01揹包問題的樸素版**非常相似,故可以採用與01揹包問題相同的方法,將**從二維優化為一維,得到最終**。

需要注意的是:

f[i][j] = max(f[i - 1][j], f[i][j - v[i]] + w[i]);//完全揹包

f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);//01揹包

完全揹包問題與01揹包不同的是嗎,在更新過程中,從小到大列舉 j 時,在計算f[ j ] 時,f[ j - v ]已經被計算過,所以說 f[ j - v ] 與 f[ i ][ j - v ]等價,故其優化**中列舉 j 時正向從小到大列舉即可

#include#include#include#includeusing namespace std;

const int n = 1010;

int f[n], v[n], w[n];

int main()

cout << f[m] << 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...