背包问题使用动态规划详细注释程序C++
背包问题是一个经典的动态规划问题,其目的是在给定的一组物品中,选择一些物品装入一个背包中,使得背包的总重量不超过其承载能力,同时价值最大化。
下面是一个使用动态规划解决背包问题的C++程序,具体注释如下:
#include <iostream>
#include <vector>
using namespace std;
// 定义物品结构体,包含重量和价值两个成员变量
struct Item {
int weight;
int value;
};
// 定义背包问题的解决函数
int knapsack(vector<Item>& items, int capacity) {
int n = items.size(); // 获取物品数量
vector<vector<int>> dp(n+1, vector<int>(capacity+1, 0)); // 初始化动态规划数组
// 依次考虑每个物品
for (int i = 1; i <= n; i++) {
// 依次考虑每个容量
for (int j = 1; j <= capacity; j++) {
// 如果当前物品重量大于剩余容量,则不能选择该物品
if (items[i-1].weight > j) {
dp[i][j] = dp[i-1][j];
}
// 否则,可以选择该物品,需要比较选择和不选择该物品两种情况的价值大小
else {
dp[i][j] = max(dp[i-1][j], dp[i-1][j-items[i-1].weight] + items[i-1].value);
}
}
}
return dp[n][capacity]; // 返回最优解
}
// 主函数
int main() {
vector<Item> items = {{2, 3}, {3, 4}, {4, 5}, {5, 6}}; // 定义物品数组
int capacity = 8; // 定义背包容量
int result = knapsack(items, capacity); // 求解背包问题
cout << "The maximum value is " << result << endl; // 输出最大价值
return 0;
}
对于上述程序,我们先定义了一个物品结构体,包含重量和价值两个成员变量。然后定义了一个函数knapsack来解决背包问题,其中,items表示物品数组,capacity表示背包容量。在函数内部,我们首先需要初始化一个二维动态规划数组dp,用于记录不同容量和不同物品下的最大价值。然后,我们依次考虑每个物品和每个容量,在每个位置上,分别比较选择和不选择该物品两种情况的价值大小,取其中较大的一个作为该位置的最大价值。最终,我们返回dp[n][capacity],即物品数组和背包容量下的最大价值。
在主函数中,我们定义了一个物品数组和一个背包容量,并调用knapsack函数求解背包问题,最终输出最大价值
原文地址: https://www.cveoy.top/t/topic/eC93 著作权归作者所有。请勿转载和采集!