揹包九講 6 分組揹包

2021-10-05 22:02:02 字數 1849 閱讀 4002

問題引入

有 n

nn 組物品和乙個容量是 v

vv 的揹包

每組物品有若干個,同一組內的物品最多只能選乙個

每件物品的體積是 vi,

jv_

vi,j

​,價值是 wi,

jw_

wi,j

​,其中 i

ii 是組號,j

jj 是組內編號

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

狀態轉移

實際上多重揹包是分組揹包一種衍化版本,或者說多重揹包是特殊情況下的分組揹包

在多重揹包那裡,我們的主要想法是將s

ss個物品分成s

ss種物品,每種分別是1,2

,...

,s

1,2,...,s

1,2,..

.,s個物品,然後相當於這s

ss種物品為一組,我們選擇最優的一種

for

(int i=

1;i<=n;i++

)}

因此分組揹包也是這樣,只不過每一組的s

ss種物品已經給出,那麼我們直接列舉s

ss種物品進行狀態轉移即可

for

(int i=

1,s;i<=n;i++

)

注意這裡的

二、三重迴圈不能交換,因為如果交換了,假設當前列舉到了第j

jj個物品,相當於f(k

)f(k)

f(k)

轉移時的f(k

−w[p

])(1

≤p

f(k-w[p])(1 \leq p f(

k−w[

p])(

1≤p可能是本組物品已經轉移後的狀態

注意到分組揹包不同於多重揹包,無法二進位制拆分或者單調佇列優化,只能列舉

例題傳送門

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define lowbit

(x)(x&

(-x)

)typedef long

long ll;

typedef unsigned long

long ull;

typedef pair<

int,

int>

p;const

double eps=

1e-8

;const

double pi=

acos(-

1.0)

;const

int inf=

0x3f3f3f3f

;const ll inf=

1e18

;const

int mod=

1e9+7;

const

int maxn=

2e5+10;

int n,m;

int f[maxn]

,v[maxn]

,w[maxn]

;int

main()

cout<

}

揹包九講之分組揹包問題

分組揹包的理解請建立前幾講的基礎上。01揹包 完全揹包 多重揹包 混合揹包 二維揹包 有n件物品,分為若干組,現約束,在每組物品裡最多取一件物品放入揹包,每件物品的重量確定,價值確定,揹包容量確定,求在不超過揹包容量的情況下,可以存放的最大價值。首先判斷乙個分組當中的一件物品,同01揹包一樣,此物品...

DP 揹包九講之分組揹包

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

揹包九講 6

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