逃亡的准备--真正裸的多重背包

【问题描述】
在《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

题解:RT

Code:

 1 Function Max(a,b:longint):longint; Begin if a>b then Exit(a) Else Exit(b); End;
 2 Var
 3   m,w,s:Array[0..2001] of integer;
 4   i,j,k,v,n,DA:longint;
 5   f:Array[0..5001] of longint;
 6 Procedure ZeroOnePack(Cost,Weight:longint);
 7   Var
 8     j:longint;
 9   Begin
10     For j:=V Downto Cost do
11       f[j]:=Max(f[j],f[j-Cost]+Weight);
12   End;
13 Procedure CompletePack(Cost,Weight:longint);
14   Var
15     j:longint;
16   Begin
17     For j:=Cost to v do
18       f[j]:=MAx(f[j],f[j-Cost]+Weight);
19   End;
20 Procedure MultiplePack(Cost,Weight,Amount:longint);
21   Var
22     i,k:longint;
23   Begin
24     if Cost*Amount>=v Then
25       Begin
26         CompletePack(Cost,Weight);
27         Exit;
28       End;
29     k:=1;
30     While k<Amount do
31       Begin
32         ZeroOnePack(k*Cost,k*Weight);
33         Dec(Amount,k);
34         k:=k Shl 1;
35       End;
36     ZeroOnePack(Amount*Cost,Amount*Weight);
37   End;
38 Begin
39   Assign(input,'hallows.in');
40   ReSeT(input);
41   Assign(output,'hallows.out');
42   ReWrite(OUtput);
43   Read(n,v);
44   For i:=1 to n do
45     Read(m[i],w[i],s[i]);
46   For i:=1 to n do
47     MultiplePack(w[i],s[i],m[i]);
48   For j:=v Downto 0 do Begin DA:=Max(Da,f[j]); {Writeln(f[j]);} End;
49   Writeln(DA);
50 
51   Close(output);
52   Close(input);
53 End.

 

转载于:https://www.cnblogs.com/Catch-22/archive/2012/11/08/2759784.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值