Submission #1242497

#TimeUsernameProblemLanguageResultExecution timeMemory
1242497menkhKnapsack (NOI18_knapsack)C++17
73 / 100
1093 ms5264 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
// #define ll long long

#define MAX 20005
vector<int> dp(MAX);
int S, n;

struct menkh {
    int value, weight, num; 
};

void solve() {
    cin >> S >> n;
    vector<menkh> items(n + 1);

    int maxWeight = 0;
    for (int i = 1; i <= n; i++) {
        cin >> items[i].value >> items[i].weight >> items[i].num;
        maxWeight = max(maxWeight, items[i].weight);
    }

    vector<pair<int, int>> group[maxWeight + 1];
    for (int i = 1; i <= n; i++) {
        group[items[i].weight].push_back({items[i].value, items[i].num});
    }

    for (int i = 1; i <= maxWeight; i++) {
        sort(group[i].begin(), group[i].end(), [](pair<int, int> &A, pair<int, int> &B) {
            return A.first > B.first;
        });
    }

    dp[0] = 0;
    for (int w = 1; w <= maxWeight; w++) {
        if (group[w].empty()) continue;
        vector<int> old_dp = dp;

        for (pair<int, int> cur : group[w]) {
            int value = cur.first;
            int num = min(S / w, cur.second);

            for (int k = 1; k <= num; k++) {
                for (int j = S; j >= k * w; j--) {
                    dp[j] = max(dp[j], old_dp[j - k * w] + k * value);
                }        
            }
            old_dp = dp;
        }
    }   

    cout << dp[S] << '\n'; 
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int t = 1;
    // int t; cin >> t; 
    while (t--) solve();
}

// 1 MB = 1000000 bytes
// 1 int = 4 bytes
// memory consumption: (sizeof(...)_int * 4) / 1000000
#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...