用C++语言写一段01背包问题的代码
以下是用C++语言写的01背包问题代码:
#include <iostream>
using namespace std;
const int MAXN = 1000; // 最大物品数量
const int MAXV = 1000; // 最大背包容量
int N, V; // 物品数量、背包容量
int w[MAXN], v[MAXN]; // 物品重量、价值
int dp[MAXV+1]; // 背包容量为 i 时的最大价值
int main()
{
// 输入物品数量和背包容量
cin >> N >> V;
// 输入每个物品的重量和价值
for (int i = 1; i <= N; i++) {
cin >> w[i] >> v[i];
}
// 初始化 dp 数组
for (int i = 0; i <= V; i++) {
dp[i] = 0;
}
// 动态规划求解
for (int i = 1; i <= N; i++) {
for (int j = V; j >= w[i]; j--) {
dp[j] = max(dp[j], dp[j-w[i]] + v[i]);
}
}
// 输出结果
cout << dp[V] << endl;
return 0;
}
代码思路:
- 首先输入物品数量和背包容量,以及每个物品的重量和价值。
- 初始化 dp 数组为 0。
- 从第一个物品开始,依次计算每个物品加入背包时的最大价值。
- 最后输出 dp[V],即背包容量为 V 时的最大价值。
动态规划状态转移方程:dp[j] = max(dp[j], dp[j-w[i]] + v[i])。
其中,dp[j] 表示背包容量为 j 时的最大价值;w[i] 表示第 i 个物品的重量;v[i] 表示第 i 个物品的价值。
原文地址: https://www.cveoy.top/t/topic/b3tC 著作权归作者所有。请勿转载和采集!