Submission #1158349

#TimeUsernameProblemLanguageResultExecution timeMemory
1158349t6stksKnapsack (NOI18_knapsack)C++20
100 / 100
88 ms9652 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3,unroll-loops") #define F first #define S second #define SZ(x) ((int)(x).size()) #define ALL(x) x.begin(), x.end() using namespace std; using ll = long long; using vi = vector<int>; using vl = vector<ll>; using vvi = vector<vi>; using vvl = vector<vl>; using pii = pair<int, int>; using pll = pair<ll, ll>; using vii = vector<pii>; using vll = vector<pll>; void sol() { int s, n; cin >> s >> n; vector<vector<ll>> items_by_weight(s + 1); for (int i = 0; i < n; i++) { int v, w, k; cin >> v >> w >> k; k = min(k, s / w); for (int j = 1; j < k; j <<= 1) { if (1ll * w * j <= s) items_by_weight[w * j].push_back(1ll * v * j); k-=j; } if (1ll * w * k <= s) items_by_weight[w * k].push_back(1ll * v * k); } vector<pair<int, ll>> items(1); for (int i = 1; i <= s; i++) { sort(ALL(items_by_weight[i]), greater<ll>()); for (int j = 0; j < SZ(items_by_weight[i]) && (j + 1) * i <= s; j++) { items.push_back({i, items_by_weight[i][j]}); } } int m = SZ(items) - 1; vl dp(s + 1); for (int i = 1; i <= m; i++) { auto &[w, v] = items[i]; for (int j = s - w; j >= 0; j--) { dp[j + w] = max(dp[j + w], dp[j] + v); } } cout << dp[s] << '\n'; } signed main() { cin.tie(nullptr)->sync_with_stdio(false); sol(); }
#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...