混合揹包(動態規劃)

2021-07-11 02:00:05 字數 1322 閱讀 8659

description

揹包體積為v ,給出n個物品,每個物品占用體積為vi,價值為wi,每個物品要麼至多取1件,要麼至多取mi件(mi > 1) , 要麼數量無限 , 在所裝物品總體積不超過v的前提下所裝物品的價值的和的最大值是多少?

input

第一行兩個數v,n下面n行每行三個數vi,wi,mi表示每個物品的體積,價值與數量,mi=1表示至多取一件,mi>1表示至多取mi件,mi=0表示數量無限

output

1個數ans表示所裝物品價值的最大值

sample input

10 3 

2 1 0 

3 3 1 

4 5 4

sample output

11

解題思路:f[j]表示一定種類物品在容量為j的揹包裡的最大價值,根據題意分別處理,迴圈為:1<=i<=n
若是完全揹包,狀態轉移方程為:

f[j]=max

(w[i]<=j<=m)

若是多重揹包,狀態轉移方程為:

f[k]=max

(1<=j<=p[j],m>=k>=w[i])

程式:var

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

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

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

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

begin

if x>y then exit(x);

exit(y);

end;

begin

readln(m,n);

for i:=1 to n do

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

for i:=1 to n do

if p[i]=0 then

begin

for j:=w[i] to m do

f[j]:=max(f[j],f[j-w[i]]+c[i]);

endelse

begin

for j:=1 to p[i] do

for k:=m downto w[i] do

f[k]:=max(f[k],f[k-w[i]]+c[i]);

end;

writeln(f[m]);

end.

版權屬於: chris

動態規劃之揹包九講之四 混合揹包

題目 有 n 種物品和乙個容量是 v 的揹包。物品一共有三類 第一類物品只能用1次 01揹包 第二類物品可以用無限次 完全揹包 第三類物品最多只能用 si 次 多重揹包 每種體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第...

動態規劃 揹包

揹包經典問題 揹包問題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 注意有意義當且僅當存...