刘翔因伤从北京奥运会的跑道上下来以后,十分的痛苦难过!全国人民看到后都为刘翔加油,支持和关心刘翔!因此,很多人写信来安慰他。没多久,就收到了一大堆信件,可他处理不了这么多,便找到ssxyh处理。ssxyh将信件分了n分,每份信件都有自己的,欣赏价值value,消耗时间time,消耗体力h,和得到的鼓舞w。观看信件必须按照价值递增(大于)的顺序观看,不一定需要全看,例如看了价值45之后就不能再看价值23的了。(为什么?,如果先看了小胡的信当然再看布什的信就不爽了,谁看得下去啊。。。。)可是,翔在伤病中,时间和体力都有限,分别为t,m,同时看完之后体力不能为0(会挂的。。)。这下ssxyh也犯难了,只好请求你帮忙,如何在这些条件下使刘翔获得最大的鼓舞呢??
输入格式
第一行n,m,t(n,m,t<=100)
第二行到n+1行,每行4个数,value,time,h,w
输出格式
一个数,最大的鼓舞!
样例输入
5 30 20
29 5 3 7
50 2 6 5
25 3 7 3
19 5 5 8
25 6 2 7
样例输出
27
很简单的两个限制的01背包问题。
但是有一个改动,体力m不能为0(因为都是整数,所以可以直接减1)!!!
所以审题一定要细心,不能被平时的习惯所左右。
想想如果这是市选赛,如果没有注意,就只有20分了!!
【另祝贺自己真正会写滚动数组了
program t1; var n,m,t,i,j,k:longint; a,b,c,d:array[1..100]of longint; f:array[0..100,0..100]of longint; procedure qsort(x,y:longint); var i,j,t,mid:longint; begin i:=x;j:=y; mid:=a[(x+y) div 2]; repeat while a[i]<mid do i:=i+1; while a[j]>mid do j:=j-1; if i<=j then begin t:=a[i];a[i]:=a[j];a[j]:=t; t:=b[i];b[i]:=b[j];b[j]:=t; t:=c[i];c[i]:=c[j];c[j]:=t; t:=d[i];d[i]:=d[j];d[j]:=t; i:=i+1;j:=j-1; end; until i>j; if i<y then qsort(i,y); if x<j then qsort(x,j); end; begin read(n,m,t); m:=m-1; for i:=1 to n do read(a[i],b[i],c[i],d[i]); qsort(1,n); for i:=1 to n do for j:=t downto 0 do for k:=m downto 0 do if (f[j,k]<f[j-b[i],k-c[i]]+d[i])and(j>=b[i])and(k>=c[i]) then f[j,k]:=f[j-b[i],k-c[i]]+d[i]; write(f[t,m]); end.