1 条题解

  • 0
    @ 2024-5-7 16:34:54

    方法二:状态压缩

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        int M, N;  // M 是背包容量,N 是物品数量
        cin >> M >> N;
    
        // 动态数组存储每个物品的重量和价值
        vector<int> W(N), C(N);
        for (int i = 0; i < N; ++i) {
            cin >> W[i] >> C[i];  // 输入每个物品的重量和价值
        }
        // 动态数组 dp,大小为 M + 1,初始值为 0
        vector<int> dp(M + 1, 0);
    
        // 完全背包问题的核心遍历
        for (int i = 0; i < N; ++i) {  // 遍历每个物品
            for (int j = W[i]; j <= M; ++j) {  // 遍历背包容量,从小到大遍历
                dp[j] = max(dp[j], dp[j - W[i]] + C[i]);  // 状态转移
            }
        }
    
        // 输出结果,即背包容量为 M 时的最大价值
        cout <<"max="<<dp[M] << endl;
    
        return 0;
    }
    
    
    • 1

    信息

    ID
    419
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    54
    已通过
    14
    上传者