Submission #1353229

#TimeUsernameProblemLanguageResultExecution timeMemory
1353229thewizardmanKnapsack (NOI18_knapsack)C++20
100 / 100
40 ms34216 KiB
#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
#define ms(x, y) memset(x, y, sizeof x)
#define sp ,' ',
#define el ,'\n'
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int, int>;
using pil = pair<int, ll>;
using l2 = array<ll, 2>;

template<typename... Args>
inline void out(Args... args) {
  (cout << ... << args);
}

struct r {
  template<typename T>
  inline r& operator,(T& x) {
    cin >> x;
    return *this;
  }
} in;
#define in in,

ll s, n, dp[2001][2001], ans;
vector<l2> items[2001];

void solve() {
  in s, n;
  for (int i = 0; i < n; i++) {
    ll v, w, k; in v, w, k;
    k = min(k, (s+w-1) / w);
    items[w].push_back({v, k});
  }
  for (ll i = 1; i <= s; i++) {
    sort(items[i].begin(), items[i].end(), greater<l2>());
    ll cur = 0;
    for (int j = 0; j < items[i].size(); j++) {
      cur += i * items[i][j][1];
      if (cur >= s) { items[i].resize(j+1); break; }
    }
    for (int j = 1; j < items[i].size(); j++) items[i][j][1] += items[i][j-1][1];
    // out(i el);
    // for (int j = 0; j < items[i].size(); j++) out(items[i][j][0] sp items[i][j][1] el);
  }
  for (int i = 1; i <= s; i++) for (int j = 1; j <= s; j++) {
    dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
    ll v = 0, w = 0, at = 0;
    for (int k = 0; k <= s/i; k++) {
      if (at < items[i].size() && k >= items[i][at][1]) at++;
      if (at >= items[i].size()) break;
      v += items[i][at][0];
      w += i;
      if (w > j) break;
      dp[i][j] = max(dp[i][j], dp[i-1][j-w] + v);
    }
  }
  for (int j = 0; j <= s; j++) ans = max(ans, dp[s][j]);
  out(ans el);
}

signed main() {
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  int t = 1;
  // in(t);
  while (t--) solve();
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...