WOJ 2069 分組揹包

2021-09-25 07:49:48 字數 2818 閱讀 2844

2 分析

3 **

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

第1行:三個整數,v,n,t(v<=200,n<=30,t<=10) 第2行到n+1行:每行3個整數wi,ci,p,表示每個物品的重量,價值,組號

乙個數,表示最大總價值

輸入

10 6 3

2 1 1

3 3 1

4 8 2

6 9 2

2 8 3

3 9 3

輸出

石室聯中woj

裸的板子題

考慮如何做到每個組中最多選乙個,當然是按組處理

也就是說第一層迴圈是對組的迴圈

再考慮如何限制「最多選乙個」,我們來看一般的轉移方程:

i f(

v≥wi

)fv=

max(

fv,f

v−wi

+ci)

if(v\geq w_i)f_v=max(f_v,f_+c_i)

if(v≥w

i​)f

v​=m

ax(f

v​,f

v−wi

​​+c

i​)考慮到最多選乙個,所以採用"01揹包"的做法,倒著列舉vvv

若是先迴圈i

ii,再迴圈v

vv,則迴圈中後面的i

ii會用到前面i

ii的結果

舉個例子,假設某組中分別為[1,

2],[

2,3]

[1,2],[2,3]

[1,2],

[2,3

](形式為[wi

,ci]

[w_i,c_i]

[wi​,c

i​]),v=3

v=3v=

3先對i=1

i=1i=

1來一次迴圈,f=[

0,2,

2,2]

f=[0,2,2,2]

f=[0,2

,2,2

]再對i=2

i=2i=

2來一次,f=[

0,2,

3,5]

f=[0,2,3,5]

f=[0,2

,3,5

]答案為f3=

5f_3=5

f3​=5

那麼問題來了,真的能取到5

55麼?顯然不能,因為1和2不能同時取

而這個5的**便是因為對i=2

i=2i=

2進行迴圈時,f3−

2=f1

=2

f_=f_1=2

f3−2​=

f1​=

2這個結果是通過取1得到的,而此處再取2便得到了5。顯然這與題意「每組最多取乙個」不符

所以先迴圈v

vv,再迴圈i

ii,這樣就保證對每個i

ii,算出的結果不會用來和另乙個同組的i

ii取max

maxma

x。舉個例子(資料同上)

v =3

,f=[

0,0,

0,0]

v=3,f=[0,0,0,0]

v=3,f=

[0,0

,0,0]v=

2,f=

[0,0

,3,0

]v=2,f=[0,0,3,0]

v=2,f=

[0,0

,3,0]v=

1,f=

[0,2

,3,0

]v=1,f=[0,2,3,0]

v=1,f=

[0,2

,3,0]v=

0,f=

[0,2

,3,0

]v=0,f=[0,2,3,0]

v=0,f=

[0,2

,3,0]∴a

ns=0

\therefore ans=0

∴ans=0

#include

using

namespace std;

template

<

typename t>

inline

void

read

(t &n)

const

int maxv =

205;

const

int maxn =35;

const

int maxt =15;

int v, n, k;

int group[maxt]

[maxn]

, num[maxt]

;int f[maxv]

, w[maxn]

, c[maxn]

, p[maxn]

;int

main()

for(

register

int i=

1; i<=k; i++

)for

(register

int j=v; j>=

0; j--

)for

(register

int k=

1; k<=num[i]

; k++

) cout<

}

6666 分組揹包

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

分組揹包 Acwing 9 分組揹包問題

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

揹包九講 6 分組揹包

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