제출 #1306096

#제출 시각아이디문제언어결과실행 시간메모리
1306096turtle_keyKnapsack (NOI18_knapsack)C++20
100 / 100
40 ms2012 KiB
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
#define ll long long
using namespace std;
bool cmp(pair<int,int> a, pair<int,int> b){
  return a.first > b.first;
}
const int NMAX = 2000;
int dp[NMAX + 1];
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int S, N;
    cin >> S >> N;

    vector<vector<pair<int,int>>> bucket(S + 1);

    for (int i = 0; i < N; i++) {
        int V, W;
        long long K;
        cin >> V >> W >> K;

        int L = S / W;
        long long cnt = min<long long>(K, L);
        bucket[W].push_back({V, cnt});
    }




    vector<pair<int,int>> items(2000);

    for (int w = 1; w <= S; w++) {
        if (bucket[w].empty()){
          continue;
        } 

        int L = S / w; // max usuable count
        auto &vec = bucket[w];
        sort(vec.begin(), vec.end(), cmp); 

        int remaining = L;
        for (auto [val, cnt] : vec) {
            if (remaining == 0){ 
              break;
            }
            int take = min(cnt, remaining);
            remaining -= take;

            for (int t = 0; t < take; t++) {
                items.push_back({w, val});
            }
        }
    }

    for (auto [w, val] : items) {
        for (int cap = S; cap >= w; cap--) {
            dp[cap] = max(dp[cap], dp[cap - w] + val); 
        }
    }

    cout << dp[S] << "\n";
    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...