80pts求调
  • 板块题目总版
  • 楼主LookatSea
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/4/3 20:19
  • 上次更新2024/4/3 23:01:50
查看原帖
80pts求调
943493
LookatSea楼主2024/4/3 20:19

RT

Mobile Games Are Like a Job[简单版]

题目背景

fhj要玩些手机游戏,但是他时间不太够。

题目描述

为了取得最大的收益,fhj有一个能同时玩 MM 个游戏的多开器,他还对总计 NN 个游戏都标记了其每日任务用时 AiA_{i} 与收益 BiB_{i}。
但是很不幸,他只有 TT分钟来玩这些游戏。
因为fhj还要着急去完成每日任务,所以他想让你帮他计算一下他能取得的最大收益 SS。

输入格式

第一行输入三个用空格隔开的数 MM,NN,TT。
接下来输入 NN 行,每行两个用空格隔开的数 AiA_{i},BiB_{i}。

输出格式

输出一行 SS。

样例 #1

样例输入 #1

1 2 5
2 4
4 5

样例输出 #1

5

提示

数据规模&约定

对于40%的数据,保证

1≤M≤101 \le M \le 10
1≤N,T,Ai,Bi≤1001 \le N,T,A_{i},B_{i} \le 100

对于60%的数据,保证

1≤M≤501 \le M \le 50
1≤N,T,Ai,Bi≤5001 \le N,T,A_{i},B_{i} \le 500

对于100%的数据,保证

1≤M≤1001 \le M \le 100
1≤N,T,Ai,Bi≤1041 \le N,T,A_{i},B_{i} \le 10^{4}

#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;
}
2024/4/3 20:19
加载中...