应试技巧
Description
考试就是用分数来评价一个学生的,那么在考试中如何在规定的时间内得到更高的分数就成为关键问题,其实信息学竞赛中又何尝不是如此。
我们知道,平时的在考试中,其中出现的试题一定是我们学过的知识,也就是说,所有的试题只要给足够的时间,那么我们一定能够完全正确的做出来。然而考试不可能没有时间限制,因此我们在开始做题之前最好先认真审题,估计一下每一题如果要完全正确地做出来所需要的时间,然后选择一些有把握的题目先做。 当然,如果做完了预先选择的题目之后还有时间,但是这些时间又不足以完全解决一道题目,应该把其他的简便方法随便做做,争取“骗”一点分数。
现在给出一张试卷上每一题解题时间的估计值,确定一种做题方案(即哪些题目认真做,哪些题目“骗”分,哪些不做),使能在限定的时间内获得最高的得分。
Input
第1行有两个正整数 N 和 T,表示题目的总数以及竞赛的时限(单位秒); 以下的n行,每行 4 个正整数 W1i 、T1i 、W2i 、T2i ,分别表示第i题:完全正确做出来的得分,完全正确做出来所花费的时间(单位秒),“骗”来的分数,“骗”分所花费的时间(单位秒)。
Output
只有一行一个整数,表示最高分数。
Sample Input 1
【输入1】
4 10800
18 3600 3 1800
22 4000 12 3000
28 6000 10 3000
32 8000 24 6000
【输入2】
3 7200
50 5400 10 900
50 7200 10 900
50 5400 10 900
Sample Output 1
【输出1】
50
【输出2】
70
Hint
3<=N<=30,2<=T<=1080000, 1 <= W1i、W2i<= 30000,1<=T1i、T2i<=T。
#include<bits/stdc++.h>
using namespace std;
int w1[35],t1[35],w2[35],t2[35];
int f[1080005];
int main(){
memset(f,0,sizeof(0));
int n,t;
scanf("%d%d",&n,&t);
for(int i=1;i<=n;i++) scanf("%d%d%d%d",&w1[i],&t1[i],&w2[i],&t2[i]);
for(int i=1;i<=n;i++){
for(int j=t;j>=min(t2[i],t1[1]);j--){ //类似于01背包
if(j-t1[i]>=0) f[j]=max(f[j],f[j-t1[i]]+w1[i]);
if(j-t2[i]>=0) f[j]=max(f[j],f[j-t2[i]]+w2[i]); //认真做 与 骗分 的情况
}
}
printf("%d\n",f[t]);
return 0;
}