题目描述
洛谷的运营组决定,如果一名oier向他的教练推荐洛谷,并能够成功的使用(成功使用的定义是:该团队有20个或以上的成员,上传10道以上的私有题目,布置过一次作业并成功举办过一次公开比赛),那么他可以浪费掉kkksc03的一些时间的同时消耗掉kkksc03的一些金钱以满足自己的一个愿望。
Kkksc03的时间和金钱是有限的,所以他很难满足所有同学的愿望。所以他想知道在自己的能力范围内,最多可以完成多少同学的愿望?
输入输出格式
输入格式:
第一行,n M T,表示一共有n(n<=100)个愿望,kkksc03 的手上还剩M(M<=200)元,他的暑假有T(T<=200)分钟时间。
第2~n+1行 mi,ti 表示第i个愿望所需要的金钱和时间。
输出格式:
一行,一个数,表示kkksc03最多可以实现愿望的个数。
输入输出样例
说明
提示 第1,2,3,6个
分析:
一道良心的DP题,真的良心啊,完全背包模板题。我觉得黄体都难了,应该是橙题吧。。。
CODE:
1 #include<cmath> 2 #include<cstdio> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 const int M=205; 8 int n,m,t,ans; 9 int a[M],b[M]; 10 int f[M][M]; 11 inline int get(){ 12 char c=getchar(); 13 int res=0; 14 while (c<'0'||c>'9') c=getchar(); 15 while (c>='0'&&c<='9'){ 16 res=(res<<3)+(res<<1)+c-'0'; 17 c=getchar(); 18 } 19 return res; 20 } 21 int main() { 22 n=get(),m=get(),t=get(); 23 for (int i=1;i<=n;i++) a[i]=get(),b[i]=get(); 24 for (int i=1;i<=n;i++){ 25 for (int j=m;j>=a[i];j--){ 26 for (int k=t;k>=b[i];k--){ 27 f[j][k]=max(f[j][k],f[j-a[i]][k-b[i]]+1); 28 } 29 } 30 } 31 cout<<f[m][t]<<endl; 32 //system("pause"); 33 return 0; 34 }