Submission #1286525

#TimeUsernameProblemLanguageResultExecution timeMemory
1286525ducmanh2612Knapsack (NOI18_knapsack)C++20
0 / 100
1 ms568 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<long long> dp(S + 1, 0); // dùng long long để tránh tràn

    for (int i = 0; i < N; ++i) {
        long long V; long long W; long long K;
        cin >> V >> W >> K;

        if (W == 0) {
            // Món có trọng lượng 0: có thể lấy tối đa K cái, tổng giá trị = K*V.
            // Điều này không tiêu thụ khối lượng, nên cộng giá trị này vào mọi dp[s].
            // (Giả sử V*K không vượt quá long long; nếu problem có giới hạn khác cần xử lý riêng)
            long long add = V * K;
            for (int s = 0; s <= S; ++s) dp[s] += add;
            continue;
        }

        long long max_take = min(K, (long long)(S / W)); // giới hạn thực tế do S
        if (max_take == 0) continue; // không thể lấy món này

        // Nếu có đủ để lấp đầy (coi như unbounded)
        if (max_take * W >= S) {
            // unbounded knapsack cập nhật theo hướng tăng s
            for (int s = (int)W; s <= S; ++s) {
                dp[s] = max(dp[s], dp[s - W] + V);
            }
        } else {
            // bounded -> tách nhị phân
            long long remain = max_take;
            for (long long take = 1; remain > 0; take <<= 1) {
                long long num = min(take, remain);
                int weight = (int)(num * W);
                long long value = num * V;
                for (int s = S; s >= weight; --s) {
                    dp[s] = max(dp[s], dp[s - weight] + value);
                }
                remain -= num;
            }
        }
    }

    cout << dp[S] << '\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...