#include <bits/stdc++.h>
using namespace std;
const int INF = 2e9;
void knapsackMonotoneQueue(int n, int W, vector<int>& w, vector<int>& v, vector<int>& k) {
vector<int> f(W + 1);
for (int i = 0; i < n; ++i) {
int wi = w[i], vi = v[i], ki = k[i];
vector<int> new_f = f;
for (int y = 0; y < wi; ++y) {
deque<array<int, 2>> dq;
for (int x = 0; x * wi + y <= W; ++x) {
int idx = x * wi + y;
int G = f[idx] - x * vi;
while (!dq.empty() && G >= f[dq.back()[0]] - dq.back()[1] * vi)
dq.pop_back();
dq.push_back({idx, x});
if (!dq.empty() && x - dq.front()[1] > ki)
dq.pop_front();
new_f[idx] = f[dq.front()[0]] + (x - dq.front()[1]) * vi;
}
}
swap(f, new_f);
}
cout << f[W] << endl;
}
int main() {
int n, W;
cin >> W >> n;
vector<int> w(n), v(n), k(n);
for (int i = 0; i < n; ++i) cin >> v[i] >> w[i] >> k[i];
knapsackMonotoneQueue(n, W, w, v, k);
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |