1 条题解

  • 0
    @ 2025-4-13 11:20:07
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    void knapsack_01(vector<int>& dp, int weight, int value, int capacity) {
        for (int j = capacity; j >= weight; --j) {
            dp[j] = max(dp[j], dp[j - weight] + value);
        }
    }
    
    void knapsack_complete(vector<int>& dp, int weight, int value, int capacity) {
        for (int j = weight; j <= capacity; ++j) {
            dp[j] = max(dp[j], dp[j - weight] + value);
        }
    }
    
    void knapsack_multiple(vector<int>& dp, int weight, int value, int count, int capacity) {
        if (weight * count >= capacity) {
            // 如果总的重量超过了容量,转为完全背包问题
            knapsack_complete(dp, weight, value, capacity);
        } else {
            // 否则使用二进制优化多重背包
            for (int k = 1; k <= count; k <<= 1) {
                knapsack_01(dp, k * weight, k * value, capacity);
                count -= k;
            }
            if (count > 0) {
                knapsack_01(dp, count * weight, count * value, capacity);
            }
        }
    }
    
    int main() {
        int M, N;
        cin >> M >> N;
    
        vector<int> weights(N);
        vector<int> values(N);
        vector<int> counts(N);
    
        for (int i = 0; i < N; ++i) {
            cin >> weights[i] >> values[i] >> counts[i];
        }
    
        vector<int> dp(M + 1, 0);
    
        for (int i = 0; i < N; ++i) {
            if (counts[i] == 0) {
                knapsack_complete(dp, weights[i], values[i], M);
            } else if (counts[i] == 1) {
                knapsack_01(dp, weights[i], values[i], M);
            } else {
                knapsack_multiple(dp, weights[i], values[i], counts[i], M);
            }
        }
    
        cout << dp[M] << endl;
    
        return 0;
    }
    
    
    
    
    • 1

    信息

    ID
    477
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    3
    上传者