P1855 榨取kkksc03
洛谷的运营组决定,如果一名 OIer 向他的教练推荐洛谷,并能够成功的使用(成功使用的定义是:该团队有 2020 个或以上的成员,上传 1010 道以上的私有题目,布置过一次作业并成功举办过一次公开比赛),那么他可以浪费掉 kkksc03 的一些时间的同时消耗掉 kkksc03 的一些金钱以满足自己的一个愿望。
kkksc03 的时间和金钱是有限的,所以他很难满足所有同学的愿望。所以他想知道在自己的能力范围内,最多可以完成多少同学的愿望?
输入格式
第一行三个整数 n,M,Tn,M,T,表示一共有 nn(1 \le n \le 1001≤n≤100)个愿望, kkksc03 的手上还剩 MM(0 \le M \le 2000≤M≤200)元,他的暑假有 TT(0 \le T \le 2000≤T≤200)分钟时间。
第 22~n+1n+1 行 m_{i}mi , t_{i}ti 表示第 ii 个愿望所需要的金钱和时间。
输出格式
一行,一个数,表示 kkksc03 最多可以实现愿望的个数。
输入输出样例
输入 #1复制
6 10 10 1 1 2 3 3 2 2 5 5 2 4 3
输出 #1复制
4
#include<iostream>
using namespace std;
struct node{
int m;//money
int t;//time
};
node a[105];
int dp[205][205];
int main(){
int n,M,T;
cin>>n>>M>>T;
for(int i=1;i<=n;i++)
cin>>a[i].m>>a[i].t;
for(int i=1;i<=n;i++)
for(int tim=T;tim>=a[i].t;tim--)
for(int mon=M;mon>=a[i].m;mon--)
dp[mon][tim] = max(dp[mon][tim],dp[mon-a[i].m][tim-a[i].t]+1);
cout<<dp[M][T];
return 0;
}
分析 : 只是在 01 背包的基础上增加了 一个新的费用
f[i,j] :金钱为 i 时间为 j 可获得最大的人数
dp[i][j] = max(dp[i][j],dp[i-a[i].m][j-a[i].t]+1);