【完全背包】奖金

题目:奖金 rqnoj162

题目描述

在获得吞噬比赛的胜利后,主办方居然只给了M(0<=M<=10000)元,一番咒骂后,你为了庆祝一番,决定用这M元买点东西.现在有N(0<n<=5000)个种类的东西让你挑选,每个东西都有一个价格(0<=W<=M)和一个价值(0<=Q<=20000),每种东西都能挑无数个,现在,你的任务是:当这M元恰好花完时,使所挑选的物品价值总和最大

输入格式

第一行二个数N,M
接下来N行每行两个数,分别是价格和价值

输出格式

一个数,为当这M元恰好花完时,最大物品价值总和(数据保证存在解)

样例输入

样例输出

 

题目几乎已经说明了是完全背包,直接上代码

不过一定注意赋初值!!!

Pascal Code

program rqnoj162;

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

procedure init;
begin
  assign(input,'rqnoj162.in');
  assign(output,'rqnoj162.out');
  reset(input);
  rewrite(output);
end;

procedure outit;
begin
  close(input);
  close(output);
  halt;
end;

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

procedure main;
var
  i,j,k:longint;
begin
  for i:=1 to n do f[i]:=-1;//这里一定要赋初值,后面也一定要判断,因为0也是可能出现的!!!
  for i:=1 to n do
  begin
    for j:=p[i] to m do
    begin
      if (f[j-p[i]]<>-1)and(f[j]<f[j-p[i]]+a[i]) then
        f[j]:=f[j-p[i]]+a[i];
    end;
  end;
  writeln(f[m]);
end;

begin
  init;
  readdata;
  main;
  outit;
end.

 

 

posted @ 2012-08-19 16:38  jiangzh  阅读(187)  评论(0)    收藏  举报