庆功会(party)

24 篇文章 0 订阅
庆功会

Time Limit:10000MS  Memory Limit:65536K
Total Submit:20 Accepted:7 

Description 
八(1)班由于在期中考中获得了团体第一名,班主任吴老师决定开一场庆功会。于是购买东西的任务就交给了小李同学(钱由班会出)。由于小李同学四肢发达,头脑简单,于是这个任务便落到了你头上(当然不要你跑腿。跑腿是小李的事 ^_^) 
注:可以全买,但不能不买。即至少买1种 

Input 
(party) 
第一行二个数n(n<=500),m(m <= 5000),其中n代表希望购买的物品的种数,m表示班会拨给小李的钱数。 
接下来n行,每行3个数,v、w、s,分别表示第I种物品的价格、价值(价格 与 价值 是不同的概念)和购买的数量(只能买0件或s件),其中v <= 100,w <= 1000,s <= 10 

Output 
共两行: 
第一行:一个数,表示此次购买能获得的最大的价值(注意!不是价格)。 
第二行:小李此次购买(能获得的最大价值)所选择的物品种类的序号。 

Sample Input 

5 1000
80 20 4
40 50 9
30 50 7
40 30 6
20 20 1

Sample Output 

1000
2 3 4 5

Source 


算法:DP

此题就是一个简单的01背包+记录路径。
01背包就不说了很简单,我选择的记录路径的方法就是开一个字符串数组,然后不停的更新某个容量的背包,即大于之前的值就进行更新替换,最后直接输出即可。

坑爹的说,最后直接用了chr,也不知道自己为什么这么傻X,这么做只能算10以内的,怪不得只过了1个点。。。


program party;

const
 maxn=500;
 maxm=6000;

type
 atp=record
  w,v,num:longint;
 end;

var
 n,m:longint;
 s:array [0..maxm] of ansistring;
 a:array [0..maxn] of atp;
 f:array [0..maxm] of longint;

procedure init;
var
 i:longint;
begin
 readln(n,m);
 for i:=1 to n do readln(a[i].w,a[i].v,a[i].num);
end;

procedure main;
var
 i,j:longint;
 ss:ansistring;
begin
 for i:=1 to n do
  begin
   for j:=m downto a[i].num*a[i].w do
    begin
     if f[j-a[i].num*a[i].w]+a[i].num*a[i].v>f[j] then
      begin
       f[j]:=f[j-a[i].num*a[i].w]+a[i].num*a[i].v;
       str(i,ss);
       s[j]:=s[j-a[i].num*a[i].w]+ss+' ';
      end;
    end;
  end;
end;

procedure print;
begin
 writeln(f[m]);
 writeln(s[m]);
end;

begin
 assign(input,'party.in'); reset(input);
 assign(output,'party.out'); rewrite(output);

 init;
 main;
 print;

 close(input); close(output);
end.


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值