Submission #1307061

#TimeUsernameProblemLanguageResultExecution timeMemory
1307061supersonicman12Knapsack (NOI18_knapsack)C++20
100 / 100
75 ms1708 KiB
#include <bits/stdc++.h>
using namespace std;
const int NINF = -1e9;
int S, n;
// pair<val, qty> O[weight]
int dp[2005];
priority_queue<pair<int,int>> O[2005];

int main(){
    cin >> S >> n;
    for (int i = 1; i <= S; i++) dp[i] = NINF;
    for (int i = 1; i <= n; i++){
        int v, w, k;
        cin >> v >> w >> k;
        O[w].push({v, k});
    }

    for (int w = 1; w <= 2000; w++){
        if (O[w].empty()) continue;
        int fit = S/w;
        while (!O[w].empty()){
            auto [v, k] = O[w].top(); O[w].pop();
            int x = min(fit, k);
            for (int bit = 1; x >= bit; bit<<=1){
                for (int i = S; i >= w*bit; i--){
                    dp[i] = max(dp[i-w*bit]+v*bit, dp[i]);
                }
                x -= bit;
            }
            if (x != 0){
                for (int i = S; i >= w*x; i--){
                    dp[i] = max(dp[i-w*x]+v*x, dp[i]);
                }
            }
            if (fit <= k) break;
            fit -= k;
        }
    }
    int ans = 0;
    for (int i = 1; i <= S; i++){
        ans = max(dp[i], ans);
    }
    cout << ans << endl;
    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...