[noip]刘翔!加油!(审题细心问题 !!)

刘翔因伤从北京奥运会的跑道上下来以后,十分的痛苦难过!全国人民看到后都为刘翔加油,支持和关心刘翔!因此,很多人写信来安慰他。没多久,就收到了一大堆信件,可他处理不了这么多,便找到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.


 

你可能感兴趣的:([noip]刘翔!加油!(审题细心问题 !!))