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...