文章

6

粉丝

38

获赞

1

访问

2.7k

头像
完全背包问题 题解:
P1569
发布于2024年4月20日 19:06
阅读数 509

代码:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n, W;
    while (cin >> n >> W) {
        vector<int> weights(n), values(n);

        // 读取每种物品的重量和价值
        for (int i = 0; i < n; i++) {
            cin >> weights[i] >> values[i];
        }

        // 动态规划数组,大小为背包容量 + 1
        vector<int> dp(W + 1, 0);

        // 进行动态规划计算
        for (int i = 0; i < n; i++) {
            // 完全背包核心转移方程,反向遍历
            for (int j = weights[i]; j <= W; j++) {
                dp[j] = max(dp[j], dp[j - weights[i]] + values[i]);
            }
        }

        // 输出最大价值
        cout << dp[W] << endl;
    }
    return 0;
}

 

核心代码解释

/*
物品数量 n = 3
背包容量 W = 4
物品重量和价值:
物品 1: 重量 1,价值 2
物品 2: 重量 2,价值 5
物品 3: 重量 3,价值 7
这段代码首先初始化一个动态规划数组 dp,其长度为背包的容量 W + 1,即 dp[0] 到 dp[4],所有元素初始化为 0,表示最初背包的价值为 0。

动态规划计算过程:
第一轮循环:处理...
登录查看完整内容


登录后发布评论

1 条评论
藕糖
2024年4月21日 18:48

红色字体前面的1可以忽略

赞(0)