제출 #528321

#제출 시각아이디문제언어결과실행 시간메모리
528321theysoldtheworldKnapsack (NOI18_knapsack)C++14
37 / 100
43 ms1996 KiB
#include <bits/stdc++.h>
 
using namespace std;

struct Item {
  long long v , w , k;
};
 
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int S , N;
  cin >> S >> N;
  vector<Item> a(N);
  for (int i = 0 ; i < N ; i++) {
    cin >> a[i].v >> a[i].w >> a[i].k;
    a[i].k = min(a[i].k , S * 1LL);
  }
  const long long inf = (long long)1e18;
  auto Get_candidates = [&](int val) {
    vector<long long> c;
    for (int i = 30 ; i >= 0 ; i--) {
      long long cur = (1LL << i);
      if (cur <= val) {
        c.push_back(cur);
        c.push_back(val - (cur - 1));
        c.push_back(val - cur);
      }
    }
    return c;
  };

  vector<vector<long long>> dp(N , vector<long long> (S + 1 , -1));
  function<long long(int , long long)> Solve = [&](int id , long long cur) {
    if (cur < 0) return -inf;
    if (id == N) return 0LL;
    auto &p = dp[id][cur];
    if (p != -1) return p;
    long long ans = -inf;
    vector<long long> c = Get_candidates(a[id].k);
    for (int i = 0 ; i < (int)c.size() ; i++) {
      assert(c[i] <= a[id].k);
      long long cost = a[id].w * c[i];
      long long add = a[id].v * c[i];      
      ans = max(ans , Solve(id + 1 , cur - cost) + add);
    }
    ans = max(ans , Solve(id + 1 , cur));
    return p = ans;
  };
  cout << Solve(0 , S) << '\n';
  return 0; 
}
#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...