Submission #1221437

#TimeUsernameProblemLanguageResultExecution timeMemory
1221437mifzal5331Knapsack (NOI18_knapsack)C++20
100 / 100
61 ms2888 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long

int main() {
    int kapasitas, barang;
    cin >> kapasitas >> barang;

    vector<int> harga(barang), berat(barang), stok(barang);
    for (int i = 0; i < barang; i++) {
        cin >> harga[i] >> berat[i] >> stok[i];
    }

    vector<vector<pair<int, int>>> bagianberat(kapasitas + 1);
    for (int i = 0; i < barang; i++) {
        if (berat[i] <= kapasitas)
            bagianberat[berat[i]].push_back({harga[i], stok[i]});
    }

    vector<pair<int, int>> barangnya;
    for (int w = 1; w <= kapasitas; w++) {
        sort(bagianberat[w].rbegin(), bagianberat[w].rend());
        int bisadipakai = kapasitas / w;

        for (auto &it : bagianberat[w]) {
            int harga = it.first, stock = it.second;
            int yangdiambil = min(stock, bisadipakai);
            bisadipakai -= yangdiambil;

            for (int j = 1; yangdiambil > 0; j <<= 1) {
                int komposisi = min(j, yangdiambil);
                yangdiambil -= komposisi;
                barangnya.push_back({w * komposisi, harga * komposisi});
            }

            if (bisadipakai == 0) break;
        }
    }

    vector<ll> dp(kapasitas + 1, 0);
    for (auto &it : barangnya) {
        int w = it.first, v = it.second;
        for (int j = kapasitas; j >= w; j--) {
            dp[j] = max(dp[j], dp[j - w] + v);
        }
    }

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

//dp[j]=maximan hargaue dengan kapasitas maksimal j
#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...