您的位置:首页 > 其它

【01背包】【字符串处理】庆功会

2012-08-19 08:45 162 查看

题目:庆功会 rqnoj109

题目描述

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

输入格式

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

输出格式

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

样例输入

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

样例输出

1000
2 3 4 5

题目第一问应该很简单,标准的01背包

主要是第二问要求记录方案,我们可以维护一个和 f 同步的字符串数组即可



Pascal Code

program rqnoj109;

var
n,m:longint;
a,p:array[0..500+10] of longint;
s:array[0..5000+10] of string;
f:array[0..5000+10] of longint;

procedure init;
begin
assign(input,'rqnoj109.in');
assign(output,'rqnoj109.out');
reset(input);
rewrite(output);
end;
procedure outit;
begin
close(input);
close(output);
halt;
end;

procedure readdata;
var
i,x,y,z:longint;
begin
read(n,m);
for i:=1 to n do
begin
read(x,y,z);
a[i]:=x*z;
p[i]:=y*z;
end;
end;

function sssss(x:longint):string;
var
k,kk:string;
a,i:longint;
begin
k:='';
while x<>0 do
begin
a:=x mod 10;
k:=k+chr(a+ord('0'));
x:=x div 10;
end;
kk:='';
for i:=length(k) downto 1 do
begin
kk:=kk+k[i];
end;
exit(kk);
end;

procedure main;
var
i,j:longint;
begin
for i:=1 to n do
for j:=m downto a[i] do
begin
if f[j]<f[j-a[i]]+p[i] then
begin
f[j]:=f[j-a[i]]+p[i];
s[j]:=s[j-a[i]]+' '+sssss(i);//貌似pascal有一个函数可以直接调用,不需要自己写函数
end;
end;
writeln(f[m]);
for i:=2 to length(s[m]) do write(s[m][i]);
end;

begin
init;
readdata;
main;
outit;
end.


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: