逃亡的准备
(hallows.pas/c/cpp)
【问题描述】
在《Harry Potter and the Deathly Hallows》中,Harry Potter他们一起逃亡,现在有许多的东西要放到赫敏的包里面,但是包的大小有限,所以我们只能够在里面放入非常重要的物品,现在给出该种物品的数量、体积、价值的数值,希望你能够算出怎样能使背包的价值最大的组合方式,并且输出这个数值,赫敏会非常地感谢你。
【输入文件】(hallows.in)
(1)第一行有2个整数,物品种数n和背包装载体积v。
(2)2行到n+1行每行3个整数,为第i种物品的数量m、体积w、价值s。.
【输出文件】(hallows.out)
输出文件hallows.out仅包含一个整数,即为能拿到的最大的物品价值总和。
【输入样例】
2 10
3 4 3
2 2 5
【输出样例】
13
【注释】
选第一种一个,第二种两个。
结果为3*1+5*2=13
【数据规模】
对于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
===================
多重背包问题
==============
var
n,v:longint;
wi,si:array[1..2000]of longint;
num:array[1..2000]of longint;
f:array[0..500]of longint;
procedure init;
begin
assign(input,'hallows.in');
assign(output,'hallows.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
function max(a,b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;
procedure dp1(cost,worth:longint);
var
i:longint;
begin
for i:=cost to v do
f[i]:=max(f[i],f[i-cost]+worth);
end;
procedure dp2(amount,cost,worth:longint);
var
k,i:longint;
begin
k:=1;
while k<amount do
begin
for i:=v downto (k*cost) do
f[i]:=max(f[i],f[i-k*cost]+k*worth);
amount:=amount-k;
k:=k*2;
end;
for i:=v downto amount*cost do //这里要注意...
f[i]:=max(f[i-amount*cost]+amount*worth,f[i]);
end;
procedure main;
var
i:longint;
begin
readln(n,v);
for i:=1 to n do
readln(num[i],wi[i],si[i]);
fillchar(f,sizeof(f),0);
for i:=1 to n do
if num[i]*wi[i]>=v then dp1(wi[i],si[i])
else dp2(num[i],wi[i],si[i]);
writeln(f[v]);
end;
begin
init;
main;
terminate;
end.