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輸出 石室聯中woj2 1 1
3 3 1
4 8 2
6 9 2
2 8 3
3 9 3
裸的板子題
考慮如何做到每個組中最多選乙個,當然是按組處理
也就是說第一層迴圈是對組的迴圈
再考慮如何限制「最多選乙個」,我們來看一般的轉移方程:
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 是組內編號 求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大,輸出最...