逃亡的准备(hallows.pas/c/cpp)

 

逃亡的准备

(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.   


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值