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

题目:庆功会 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

输出格式

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

样例输入

样例输出

 

题目第一问应该很简单,标准的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.

 

 

posted @ 2012-08-19 08:45  jiangzh  阅读(502)  评论(0)    收藏  举报