【完全背包】奖金
题目:奖金 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.

..... 转载请注明出处 ..... http://oijzh.cnblogs.com ..... by jiangzh
浙公网安备 33010602011771号