#38209: C++答案


samlin961112@gmail.com (林哲甫)

學校 : 新北市私立南山高級中學
編號 : 220506
來源 : [123.252.121.18]
最後登入時間 :
2024-11-21 19:33:28
k771. 請認真做好值日! -- 三國迷李牧粉題集 | From: [219.70.213.92] | 發表日期 : 2023-11-03 20:45

#include <bits/stdc++.h>
using namespace std;
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, m, o; // 時間, 分數, 工作
  cin >> n >> m >> o;
  vector<pair<int, int>> a(o); // 時間, 分數
  for (int i = 0; i < o; i++) {
    cin >> a[i].first >> a[i].second;
  }
  vector<vector<int>> dp(o, vector<int>(n + 1, 0)); // 時間,分數
  for (int i = 0; i < o; i++) {
    for (int j = 0; j <= n; j++) {
      if (i == 0) {
        if (a[i].first <= j) {
          dp[i][j] = a[i].second;
        }
      } else {
        dp[i][j] = dp[i - 1][j]; // 預設值為上一行的相同時間
        if (a[i].first <= j) {
          dp[i][j] = max(dp[i][j], dp[i - 1][j - a[i].first] + a[i].second);
        }
      }
    }
  }
  int minTime = n;
  for (int i = 0; i <= n; i++) {
    if (dp[o - 1][i] >= m) {
      minTime = i;
      break;
    }
  }
  cout << minTime << ' ' << dp[o - 1][minTime];
}

 
ZeroJudge Forum