#include <bits/stdc++.h>
using namespace std;
int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int S, N;
        cin >> S >> N;
        vector<vector<array<int, 2>>> items(S + 1);
        for (int i = 1; i <= N; ++i) {
                int v, w, k; cin >> v >> w >> k;
                items[w].push_back({v, k});
        }
        vector<array<int, 2>> newitems = {{0, 0}};
        for (int i = 1; i <= S; ++i) {
                sort(items[i].begin(), items[i].end(), [&](const array<int, 2> a, const array<int, 2> b) {
                        return a[0] > b[0];
                });
                int cur = 0;
                for (auto x : items[i]) {
                        int p = min((S / i) - cur, x[1]);
                        for (int j = 1; j <= p; ++j) {
                                newitems.push_back({x[0], i});
                        }
                        cur += p;
                        if (cur == (S / i)) break;
                }
        }
        int NN = newitems.size() - 1;
        vector<vector<int64_t>> DP(NN + 1, vector<int64_t>(S + 1));
        for (int i = 1; i <= NN; ++i) {
                for (int j = 1; j <= S; ++j) {
                        if (j >= newitems[i][1]) {
                                DP[i][j] += max(DP[i][j], DP[i - 1][j - newitems[i][1]] + newitems[i][0]);        
                        }
                        DP[i][j] = max(DP[i][j], DP[i - 1][j]);
                }
        }
        
        cout << DP[NN][S] << '\n';
        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... |