完全揹包問題

2021-10-24 12:48:05 字數 2168 閱讀 4249

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

第i種物品的費用是w[i], 價值是c[i]。求解將哪些物品裝入揹包可使這些物品的總容量不超過揹包容量,且總價值最大(優)

該問題類似於01揹包問題,所不同的是每種物品有無限件。

策略:取0件、取1件、… 取無限n

使用一維陣列的偽**:

for i =1.

. n for v =0.

. v f[v]

= max

;

以上演算法要求必須採用 v = 0 … v的正序順序迴圈,這與01揹包要求逆序不同。

為什麼?每種物品可選無限件,所以在考慮「加選一件第i種物品」策略時,正需要乙個可能已選入第i種物品的子結果f[i][v-w[i]]。所以必須採用正序。

二維陣列動態轉移方程:

dp[i][v] = max

有n種物品,每種物品有乙個重量和乙個價值。但每種物品的數量是無限的,同時有一揹包,最大載重量為m,今從n種物品中選取若干件(同一物品可以多次選取),使得重量(容量)的和小於等於m,而價值的和為最大。

第 1 行:兩個整數,m(揹包容量,m<=200)和n(物品數量,n <=30);

第 2 到 n+1行: 每行兩個整數 wi,ci,表示每個物品的重量和價值。

10 4

2 13 3

4 57 8

11

#include

using

namespace std;

/*完全揹包問題(每種物品可選無限件)

設 dp[i][v]表示前i件物品,總容量不超過v的最優價值,則

dp[i][v]=max(dp[i-1][v],dp[i][v-w[i]]+c[i])

說明:完全揹包必須採用v = 0...m的正序順序迴圈。

dp[i-1][v]: 當前物品i乙個也不裝 ,則總價值採用前i-1件物品,總容量不超v的最優價值。

dp[i][v-w[i]]+c[i]:加選一件當前物品i時, 正需要累加乙個可能已選入第i件物品的子

結果dp[i][v-w[i]]

dp[n][m]即是最優解

*/const

int maxm=

201, maxn =31;

//maxm為容量

int m,n;

int w[maxn]

,c[maxn]

;int dp[maxn]

[maxm]

;int

main()

//完全揹包-一維陣列解法

/*dp(v)表示容量不超過v公斤的最大價值,則

dp(v)= max (v>=w[i], 1<=i<=n)

*/#include

using

namespace std;

const

int maxm =

2001

, maxn =31;

int n,m,v,i;

int c[maxn]

,w[maxn]

;int dp[maxm]

;//滾動陣列壓縮二維陣列,轉換成一維,減少空間成本

intmain()

完全揹包有乙個簡單有效的優化: 若兩種物品i,j 滿足 w[i] <= w[j] 同時 c[i] >= c[j] ,則將物品j去掉,不用考慮之。 正確性證明: 任何情況下都可將價值小,容量大的j換成價效比高的i,得到的方案至少不會更差。缺點:不能改善最壞情況的複雜度。

轉化為01揹包問題求解:

考慮第i種物品最多選 v/w[i]件,於是可以把第i種物品轉化為 v/w[i]件重量及價值均不變的物品,然後求解這個01揹包問題。

原理: 將一種物品拆成多件物品。

考慮把每種物品拆成o(log(v/w[i])+ 1)件物品。

運用二進位制思想,例如: 7(0111) == 2^0 + 2 ^ 1 + 2 ^ 2

k 來自集合

對應拆分集合

不管最優策略選幾件第i種物品,總可以表示成若干個 2^k件物品的和。

高效拆分法: 把第i種物品拆成費用為 w[i] * 2^k , 價值為 c[i] * 2^k 的若干件物品,其中k滿足w[i] * 2^k < v 。

揹包問題(完全揹包)

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