Submission #1300298

#TimeUsernameProblemLanguageResultExecution timeMemory
1300298javahirbekKnapsack (NOI18_knapsack)C++20
0 / 100
2 ms572 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const ll NEG = LLONG_MIN / 4; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int S, N; if (!(cin >> S >> N)) return 0; vector<ll> dp(S + 1, NEG); dp[0] = 0; for (int i = 0; i < N; ++i) { int v, w, c; cin >> v >> w >> c; // If unlimited (or enough copies to treat as complete knapsack) if ((long long)w * c >= S) { for (int j = w; j <= S; ++j) { if (dp[j - w] != NEG) dp[j] = max(dp[j], dp[j - w] + v); } continue; } // Bounded case: process by residues modulo w for (int r = 0; r < w; ++r) { // collect original values for indices idx = r + k*w int maxk = (S - r) / w; if (maxk < 0) continue; vector<ll> vals(maxk + 1); for (int k = 0; k <= maxk; ++k) { vals[k] = dp[r + k * w]; // original value for this residue } deque<int> q; // store k indices for (int k = 0; k <= maxk; ++k) { ll cur = vals[k] - (ll)k * v; // value used for queue comparisons while (!q.empty() && (vals[q.back()] - (ll)q.back() * v) <= cur) q.pop_back(); q.push_back(k); // drop too-old elements (more than c copies) while (!q.empty() && q.front() < k - c) q.pop_front(); int best = q.front(); if (vals[best] != NEG) { // candidate = vals[best] + (k - best) * v dp[r + k * w] = max(dp[r + k * w], vals[best] + (ll)(k - best) * v); } } } } // if dp[S] may be NEG meaning unreachable, you might want to print something else cout << (dp[S] == NEG ? 0LL : dp[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...