제출 #1305929

#제출 시각아이디문제언어결과실행 시간메모리
1305929avsKnapsack (NOI18_knapsack)C++20
73 / 100
1096 ms1588 KiB
#include <bits/stdc++.h>
using namespace std;

int main() {
  int n, x; cin >> x >> n;
  vector<int> w(n), v(n), k(n);
  for (int i = 0; i < n; i++) cin >> v[i] >> w[i] >> k[i];
  vector<long long> dp(x+1);
  for (int i = 0; i < n; i++) {
    if ((long long)k[i]*w[i] >= x) {
      for (int j = w[i]; j <= x; j++) dp[j] = max(dp[j], dp[j-w[i]]+v[i]);
    } else {
      int count = k[i];
      for (int mul = 1; count > 0; mul <<= 1) {
        int take = min(mul,count);
        long long tw = (long long)take*w[i], tv = (long long)take*v[i];
        for (int j = x; j >= tw; j--) dp[j] = max(dp[j],dp[j-tw]+tv);
        count -= take;
      }
    }
  }
  cout << dp.back();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...