揹包問題克星 分組揹包

2021-10-02 05:30:11 字數 1341 閱讀 4939

有n件物品,告訴你這n件物品的重量以及價值,將這些物品劃分為k組,每組中的物品互相衝突,最多選一件,求解將哪些物品裝入揹包可使這些物品的費用綜合不超過揹包的容量,且價值總和最大。

演算法:首先判斷乙個分組當中的一件物品,同01揹包一樣,此物品存在兩種狀態,取與不取,若取此物品,則繼續判斷下一組的第一件物品,若不取此物品,則繼續判斷本組下一件物品,若該物品為本組最後一件物品,則判斷下一組。也就是說設f[k][v]表示前k組物品花費費用v能取得的最大權值,則有:f[k][v]=max。使用一維陣列的偽**如下:

for 所有的組k

for v=v..0

for 所有的i屬於組k

f[v]=max

分組的揹包問題將彼此互斥的若干物品稱為乙個組,這建立了乙個很好的模型。不少揹包問題的變形都可以轉化為分組的揹包問題由分組的揹包問題進一步可定義「泛化物品」的概念,十分有利於解題。例題:hdu1712

例題:乙個旅行者有乙個最多能用v公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,…,wn,它們的價值分別為c1,c2,…,cn。這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

【輸入格式】

第一行:三個整數,v(揹包容量,v<=200),n(物品數量,n<=30)和t(最大組號,t<=10);

第2…n+1行:每行三個整數wi,ci,p,表示每個物品的重量,價值,所屬組號。

【輸出格式】

僅一行,乙個數,表示最大總價值。

sample in:

10 6 3

2 1 1

3 3 1

4 8 2

6 9 2

2 8 3

3 9 3

sample out:

#include

using

namespace std;

int dp[

205]

;int v, n, t;

int w[35]

, c[35]

;vector<

int>ve[35]

;int

main()

for(

int i =

1; i <= t; i++)}

}printf

("%d\n"

, dp[v]);

return0;

}/*10 6 3

2 1 1

3 3 1

4 8 2

6 9 2

2 8 3

3 9 3

*/

分組揹包問題

有 n nn 組物品和乙個容量是 v vv 的揹包。每組物品有若干個,同一組內的物品最多只能選乙個。每件物品的體積是 vij v vi j 價值是 wij w wi j 其中 i ii 是組號,j jj 是組內編號。求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。輸出最大價值。輸...

分組揹包問題

有 n 組物品和乙個容量是 v 的揹包。每組物品有若干個,同一組內的物品最多只能選乙個。每件物品的體積是 vij,價值是 wij,其中 i 是組號,j 是組內編號。求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行有兩個整數 n,v,用空格隔開,分別表...

分組揹包問題

分組揹包問題 有 n 組物品和乙個容量是 v 的揹包。每組物品有若干個,同一組內的物品最多只能選乙個。每件物品的體積是 vij,價值是 wij,其中 i 是組號,j 是組內編號。求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行有兩個整數 n,v,用空...