제출 #1299884

#제출 시각아이디문제언어결과실행 시간메모리
1299884sonnydaysKnapsack (NOI18_knapsack)C++20
100 / 100
53 ms3172 KiB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;
using vi = vector<int>;
#define all(x) (x).begin(), (x).end()


ll dp[2001];

int main() {
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(0);
    
    int s, n;
    cin >> s >> n;
    vector<pair<ll, ll>> w[2001];    
    ll cur_v, cur_w, cur_k;

    for (int i = 0; i < n; ++i) {
        cin >> cur_v >> cur_w >> cur_k;

        w[cur_w].push_back({cur_v, cur_k});
        // ll c = 1;
        // while (c < cur_k) {
        //     if (cur_w * c > s) {
        //         break;
        //     }
            
        //     w[c * cur_w].push_back(c * cur_v);
        //     cur_k -= c;
        //     c *= 2;
        // }
        // if (cur_k > 0) {
        //     if (cur_k * cur_w > s) continue;
        //     w[cur_k * cur_w].push_back(cur_k * cur_v);
        // }
    }

    for (int i = 1; i <= s; ++i) { // cur_wright
        sort(all(w[i]), greater<>());
        int cur_cnt = 0;
        for (int j = 0 ;j < w[i].size() && i * cur_cnt <= s; ++j) { // cur_cnt
            while (w[i][j].second) {
                if (i * cur_cnt > s) break;
                cur_cnt++;
                w[i][j].second--;
                for (int k = s; k >= i; --k) {
                    dp[k] = max(dp[k], dp[k - i] + w[i][j].first);
                }
            }

        }
    }

    cout << *max_element(dp, dp + s + 1) << '\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...