首页 > 技术文章 > 榨取kkksc03

kanchuang 2019-07-08 11:41 原文

题目描述

洛谷的运营组决定,如果一名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: 
6 10 10
1 1
2 3 
3 2
2 5
5 2
4 3
输出样例#1: 
4

说明

提示 第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 }

 

推荐阅读