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