分組揹包(動態規劃)

2021-07-11 02:00:05 字數 1369 閱讀 7437

description

有n件物品和乙個容量為v的揹包。第i件物品的費用是c[i],價值是w[i]。這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

input

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

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

output

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

sample input

10 6 3 

2 1 1 

3 3 1 

4 8 2 

6 9 2 

2 8 3 

3 9 3

sample output

20

解題思路:f[j]表示花費費用j能取得的最大權值,狀態轉移方程為:
f[j]=max

(1<=i<=t,m>=j>=0,1<=k<=a[i,0])

f[v]即為所求。

時間複雜度:

o(t^2*v)

程式:var

f:array[0..200]of longint;

w,v:array[0..30]of longint;

a:array[0..30,0..200]of longint;

n,m,i,j,k,t,p:longint;

function max(x,y:longint):longint;

begin

if x>y then exit(x) else exit(y);

end;

begin

readln(m,n,t);

for i:=1 to n do

begin

readln(w[i],v[i],p);

inc(a[p,0]);

a[p,a[p,0]]:=i;

end;

for i:=1 to t do

for j:=m downto 0 do

for k:=1 to a[i,0] do

if j>=w[a[i,k]] then f[j]:=max(f[j-w[a[i,k]]]+v[a[i,k]],f[j]);

writeln(f[m]);

end.

版權屬於: chris

動態規劃 分組揹包

問題 有n件物品,告訴你這n件物品的重量以及價值,將這些物品劃分為k組,每組中的物品互相衝突,最多選一件,求解將哪些物品裝入揹包可使這些物品的費用綜合不超過揹包的容量,且價值總和最大。演算法 首先判斷乙個分組當中的一件物品,同01揹包一樣,此物品存在兩種狀態,取與不取,若取此物品,則繼續判斷下一組的...

動態規劃 揹包

揹包經典問題 揹包問題01 乙個揹包容積為t 0 t 2000 現在有n 0 如下 includeusing namespace std int s 1005 bool f 3000 int main 揹包問題02 若每種物品有無限多個。從這n種物品中選取若干個裝入揹包內,使揹包所剩的空間最小。請求...

揹包(動態規劃)

一 01揹包問題 特點 每件物品僅有一件,可以選擇放與不放 有件物品和乙個容量為 的揹包。第 件物品的費用是 價值是 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。用子問題定義狀態 f i v max f i 1 v f i 1 v c i w i 注意有意義當且僅當存...