This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <algorithm>
using namespace std;
#define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int S, n;
struct tripla {
    int val, weight, cnt;
};
tripla input[100001];
bool csort(tripla a, tripla b) {
    if (a.val > b.val)
        return 1;
    return 0;
}
pair<int, int> a[100001];
int l;
int need[2001];
int dp[2][2001];
const int Inf = 2e9 + 1;
int main() {
    fast
    int i, j;
    cin >> S >> n;
    for (i = 1; i <= n; i++)
        cin >> input[i].val >> input[i].weight >> input[i].cnt;
    sort(input + 1, input + n + 1, csort);
    for (i = 1; i <= S; i++)
        need[i] = S / i;
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= min(need[input[i].weight], input[i].cnt); j++)
            a[++l] = {input[i].weight, input[i].val};
        j--;
        need[input[i].weight] -= j;
    }
    for (i = 0; i <= 1; i++)
        for (j = 0; j <= S; j++)
            dp[i][j] = -Inf;
    dp[0][0] = dp[1][0] = 0;
    for (i = 1; i <= l; i++)
        for (j = 1; j <= S; j++)
            if (j - a[i].first >= 0)
                dp[i % 2][j] = max(dp[1 - i % 2][j], dp[1 - i % 2][j - a[i].first] + a[i].second);
            else dp[i % 2][j] = dp[1 - i % 2][j];
    int Max = 0;
    for (i = 1; i <= S; i++)
        if (dp[n % 2][i] > Max)
            Max = dp[n % 2][i];
    cout << Max;
    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... |