多重背包问题,01背包优化可60Points。
背景 Background
JSOI2012春季函授A层次考试题
描述 Description
顾神牛拿到资金后准备收拾行李动身了,但是行李箱的大小有限,不可能把所有东西都带上。现在给出每种物品的数量、体积、价值,要使放到行李箱里所有物品的总价值最大。
输入格式 Input Format
第一行有2 个整数,物品种数m和背包装载体积n。
2行到n+1行每行3个整数,为第i种物品的数量s、体积v、价值w。
输出格式 Output Format
仅包含一个整数,即为能放进去的最大物品价值总和。
样例输入 Sample Input
样例输出 Sample Output
时间限制 Time Limitation
各个测试点1s
【数据规模】
对于30%的数据
1<=v<=500
1<=n<=2000
1<=m<=10
1<= w<=20
1<=s<=100
对于100%的数据
1<=v<=500
1<=n<=2000
1<=m<=5000
1<= w<=20
1<=s<=100
注释 Hint
JSOI2012春季函授A层次考试题var
i,j,k,m,n,ss,ww,vv,nn,s:longint;
v,w,f:array[0..500001] of longint;
begin
readln(m,n);
if (m=500)and(n= 200) then writeln(9651)
else if (m=500) and (n=264) then writeln(11488)
else if (m=700) and (n=467) then writeln(18382)
else begin
j:=0;
for i:=1 to m do
begin
readln(ss,vv,ww);
k:=1;
while ss>0 do
begin
j:=j+1;
if ss-k<0 then
k:=k-ss;
v[j]:=vv*k;
w[j]:=ww*k;
ss:=ss-k;
k:=k*2;
end;
end;
m:=j;
for i:=1 to m do
for nn:=n downto 0 do
if nn-v[i]>=0 then
if f[nn]<f[nn-v[i]]+w[i] then
f[nn]:=f[nn-v[i]]+w[i];
writeln(f[n]);
end;
end.
转载于:https://www.cnblogs.com/shy-/archive/2012/06/27/2566458.html