1 条题解

  • 0
    @ 2024-5-8 17:46:09

    方法一,二维数组结构体:

    #include <bits/stdc++.h>
    using namespace std;
    struct node {
        int weight;
        int value;
    };
    int main() {
        int M,N; // N是物品数量,M是背包的最大容量
        cin >> M >> N;
        vector<node> bag(N+1);
        for (int i = 1; i <= N; i++) {
            cin >> bag[i].weight >> bag[i].value;
        }
        // dp[i][j] 表示考虑前 i 个物品,当背包容量为 j 时的最大价值
        vector<vector<int>> dp(N + 1, vector<int>(M + 1, 0));
        // 填充动态规划表
        for (int i = 1; i <= N; i++) {
            for (int j = 0; j <= M; j++) {
                if (bag[i].weight>j) {
                    // 当前背包容量不足以放下第 i 个物品
                    dp[i][j] = dp[i-1][j];
                } else {
                int noload=dp[i-1][j];  //不装入就为上一个的价值
                int bagW=bag[i].weight;
                int basV=bag[i].value ;
                //装入为:减掉
                int load=dp[i-1][j - bagW] + basV;
                    // 选择不装入或装入第 i 个物品,取价值较大的一种情况
                    dp[i][j] = max(noload, load);
                }
            }
        }
        // 输出最大价值
        cout <<dp[N][M] << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    418
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    69
    已通过
    15
    上传者