Submission #1280836

#TimeUsernameProblemLanguageResultExecution timeMemory
1280836lucaskojimaKnapsack (NOI18_knapsack)C++17
100 / 100
39 ms3088 KiB
#include "bits/stdc++.h"
#define sz(x) (int)size(x)
#define all(x) begin(x), end(x)
#define rall(x) rbegin(x), rend(x)
#define int long long

using namespace std;
using ll = long long;
using pii = pair<int, int>;

const char nl = '\n';
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int W   = 2000;

template<class T> void chmax(T &a, T b) { if (b > a) a = b; }

int32_t main() {
  ios::sync_with_stdio(0), cin.tie(0);

  int s, n; cin >> s >> n;

  struct itemW { int v, k; };
  vector<vector<itemW>> a(W + 1);

  for (int i = 0; i < n; i++) {
    int v, w, k; cin >> v >> w >> k;
    a[w].push_back({v, k});
  }

  struct item { int v, w; };
  vector<item> b;

  for (int i = 1; i <= W; i++) {
    sort(all(a[i]), [](const itemW &a, const itemW &b){
      return a.v > b.v;
    });

    int rem = s / i;
    for (auto [v, k] : a[i]) {
      int qnt = min(rem, k);
      for (int _ = 0; _ < qnt; _++)
        b.push_back({v, i});

      rem -= qnt;
      if (rem == 0) break;
    }
  }

  vector<int> dp(s + 1, -LINF);
  dp[0] = 0;

  for (auto [v, w] : b)
    for (int i = s; i >= w; i--)
      chmax(dp[i], dp[i - w] + v);

  cout << *max_element(all(dp)) << nl;
  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...