제출 #1229687

#제출 시각아이디문제언어결과실행 시간메모리
1229687ethan7skyKnapsack (NOI18_knapsack)C++20
100 / 100
68 ms33096 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int s, n;
    cin >> s >> n;

    map<int, vector<pair<int, int>>> items;
    for(int i=0; i<n; i++) {
        int v, w, k; cin >> v >> w >> k;
        if(w<=s && k>0) {
            items[w].push_back({v, k});
        }
    }
    
    vector<vector<ll>> dp(items.size()+1, vector<ll>(s+1, INT_MIN));
    dp[0][0] = 0;
    int w_idx = 1;
    for(auto& [w, vec] : items) {
        sort(vec.begin(), vec.end(), greater<pair<int, int>>());
        for(int i=0; i<=s; i++) {
            dp[w_idx][i] = dp[w_idx-1][i];
            int t_idx = 0;
            int t_used = 0;
            int tot_used = 0;
            ll cost = 0;
            while((tot_used+1)*w <= i && t_idx < vec.size()) {
                tot_used++;
                cost += vec[t_idx].first;
                t_used++;

                if(dp[w_idx-1][i-tot_used*w] != INT_MIN) {
                    dp[w_idx][i] = max(dp[w_idx][i], dp[w_idx-1][i-tot_used*w] + cost);
                }

                if(t_used==vec[t_idx].second){
                    t_used=0;
                    t_idx++;
                }
            }
        }
        w_idx++;
    }

    ll ans=0;
    for(int i=0; i<=s; i++) {
        ans = max(ans, dp[items.size()][i]);
    }
    cout << ans << '\n';
}
#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...