RT
fhj要玩些手机游戏,但是他时间不太够。
为了取得最大的收益,fhj有一个能同时玩 M 个游戏的多开器,他还对总计 N 个游戏都标记了其每日任务用时 Ai 与收益 Bi。
但是很不幸,他只有 T分钟来玩这些游戏。
因为fhj还要着急去完成每日任务,所以他想让你帮他计算一下他能取得的最大收益 S。
第一行输入三个用空格隔开的数 M,N,T。
接下来输入 N 行,每行两个用空格隔开的数 Ai,Bi。
输出一行 S。
1 2 5
2 4
4 5
5
1≤M≤10
1≤N,T,Ai,Bi≤100
1≤M≤50
1≤N,T,Ai,Bi≤500
1≤M≤100
1≤N,T,Ai,Bi≤104
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int maxReward(int M, vector<int>& a, vector<int>& b, int T) {
int n = a.size();
vector<vector<int>> dp(n + 1, vector<int>(T + 1, 0));
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= T; ++j) {
if (a[i - 1] <= j && M > 0) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - a[i - 1]] + b[i - 1]);
M--;
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[n][T];
}
int main() {
int M, N, T;
cin >> M >> N >> T;
vector<int> a(N), b(N);
for (int i = 0; i < N; ++i) {
cin >> a[i] >> b[i];
}
cout << maxReward(M, a, b, T) << endl;
return 0;
}