Submission #1340774

#TimeUsernameProblemLanguageResultExecution timeMemory
1340774domiKnapsack (NOI18_knapsack)C++20
73 / 100
1096 ms17000 KiB
#include <bits/stdc++.h>

#define int long long
#define fi first
#define se second

#define sz(a) (int)((a).size())
#define all(a) (a).begin(), (a).end()

#define lsb(x) (x & (-x))
#define vi vector<int>
#define YES { cout << "YES" << endl; return; }
#define NO { cout << "NO" << endl; return; }

using ll = long long;
using pii = std::pair<int, int>;

const int SMAX = 5e3;
const int NMAX = 1e5;

using namespace std;

vector<pair<int, int>> obj;
int dp[SMAX + 5], n, S;

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> S >> n;

    for (int i = 1, v, w, k; i <= n; ++i) {
        cin >> v >> w >> k;
        k = min(k, (S / w) + 5);

        int cnt = 1;
        while (k > 0) {
            int take = min(cnt, k);
            obj.push_back({w * take, v * take});
            k -= take;
            cnt <<= 1;
        }
    }

    fill(dp + 1, dp + S + 1, INT_MIN);
    dp[0] = 0;
    for (auto &[w, v] : obj) {
        if (w > S) continue;
        for (int i = S; i >= w; --i)
            dp[i] = max(dp[i], dp[i - w] + v);
    }

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