#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/**
* Bounded Knapsack masalasi - NOI Singapore 2018
* Vaqt murakkabligi: O(S * N * log(K))
*/
int main() {
// Tezkor kiritish-chiqarish
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int S, N;
cin >> S >> N;
// dp[w] - w og'irlikda olinishi mumkin bo'lgan maksimal qiymat
vector<long long> dp(S + 1, 0);
for (int i = 0; i < N; i++) {
int v, w, k;
cin >> v >> w >> k;
// Ikkilik ajratish (Binary Splitting)
// k ta elementni 1, 2, 4, 8... kabi guruhlarga bo'lamiz
for (int j = 1; k > 0; j <<= 1) {
int num = min(j, k);
long long current_v = (long long)num * v;
int current_w = num * w;
// 0/1 Knapsack usulida DP ni yangilaymiz (teskari tartibda)
for (int weight = S; weight >= current_w; weight--) {
dp[weight] = max(dp[weight], dp[weight - current_w] + current_v);
}
k -= num;
}
}
// Maksimal qiymatni chiqaramiz
cout << dp[S] << endl;
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |