Submission #1320619

#TimeUsernameProblemLanguageResultExecution timeMemory
1320619tkm_algorithmsKnapsack (NOI18_knapsack)C++20
100 / 100
111 ms5180 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define int ll using P = pair<int, int>; #define all(x) x.begin(), x.end() #define rep(i, l, n) for (int i = l; i < (n); ++i) #define sz(x) (int)x.size() const char nl = '\n'; const int mod = 1e9+7; struct node { int v, w, k; }; void solve() { int s, n; cin >> s >> n; vector<P> g[s+2]; vector<node> a(n); for (auto &i: a) { cin >> i.v >> i.w >> i.k; g[i.w].push_back(P(i.v, i.k)); } sort(all(a), [](const node& x, const node& y) { if (x.v != y.v)return x.v>y.v; return x.w<y.w; }); rep(i, 1, s+1)sort(g[i].rbegin(), g[i].rend()); a.clear(); rep(i, 1, s+1) { int cnt = 0; for (auto j: g[i]) { if (cnt>=s/i)break; else cnt += j.second; a.push_back({j.first, i, j.second}); } } n = sz(a); int dp[2][s+1]; memset(dp, 0, sizeof dp); int sum =0, now = 1; rep(i, 0, n) { sum += a[i].w*a[i].k; for (int j = min(s, sum); j >= 1; --j)dp[now][j] = dp[1-now][j]; for (int k = s-a[i].w; k >= 0; k--) { for (int p = (k+a[i].w); p <= min(sum, s); p += a[i].w) { int mn = min((p-k)/a[i].w, a[i].k); dp[now][p] = max(dp[now][p], (i-1>=0?dp[1-now][k]:0ll)+mn*a[i].v); if ((p-k)/a[i].w >= a[i].k)break; } } rep(j, 1, min(s, sum)+1)dp[now][j] = max(dp[now][j], dp[now][j-1]); now = 1-now; } int res = 0; rep(i, 0, s+1)res = max(res, dp[n%2][i]); cout << res << nl; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); solve(); 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...