Submission #1262968

#TimeUsernameProblemLanguageResultExecution timeMemory
1262968khanghb2006Knapsack (NOI18_knapsack)C++20
0 / 100
0 ms324 KiB
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, S;
    if (!(cin >> N >> S)) return 0;
    vector<int> V(N), W(N), K(N);
    for (int i = 0; i < N; ++i) cin >> V[i] >> W[i] >> K[i];

    const long long NEG = (long long)-4e18;
    vector<long long> dp(S + 1, NEG);
    dp[0] = 0;

    for (int i = 0; i < N; ++i) {
        int w = W[i], v = V[i], k = K[i];

        // Trường hợp đặc biệt: w == 0
        if (w == 0) {
            if (k > 0 && v > 0) {
                long long add = 1LL * v * k;
                for (int c = 0; c <= S; ++c)
                    if (dp[c] != NEG) dp[c] += add;
            }
            // nếu v <= 0 thì lấy 0 món là tốt nhất, bỏ qua
            continue;
        }

        vector<long long> dp_old = dp;               // tách bạch trước/sau
        vector<long long> ndp(S + 1, NEG);

        int R = min(w - 1, S);
        for (int r = 0; r <= R; ++r) {
            deque<pair<long long,int>> dq;           // (value = f[t]-t*v, index=t)
            // j: số bội của w trong lớp dư r (idx = r + j*w)
            for (int j = 0; r + 1LL*j*w <= S; ++j) {
                int idx = r + j*w;

                // thêm ứng viên t = j vào dequeue (f[j] - j*v)
                long long val = dp_old[idx] - 1LL*j*v;
                while (!dq.empty() && dq.back().first <= val) dq.pop_back();
                dq.emplace_back(val, j);

                // cửa sổ chỉ giữ t in [j-k .. j]
                while (!dq.empty() && dq.front().second < j - k) dq.pop_front();

                // g[j] = max_{t in [j-k..j]} f[t] + (j-t)*v
                ndp[idx] = dq.front().first + 1LL*j*v;
            }
        }

        dp.swap(ndp);
    }

    cout << *max_element(dp.begin(), dp.end()) << '\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...