如何用C++动态规划方法求解01背包问题
时间: 2023-06-04 07:08:39 浏览: 89
可以使用以下的代码实现:
```c
#include <stdio.h>
#define MAX_N 100 // 背包最大容量
#define MAX_W 1000 // 物品最大重量
#define MAX_V 1000000 // 物品最大价值
int n, w[MAX_N], v[MAX_N];
int dp[MAX_N + 1][MAX_W + 1]; // dp[i][j] 表示前i个物品,重量不超过j时的最大价值
int max(int a, int b) {
return a > b ? a : b;
}
void solve() {
int i, j;
for (i = 0; i <= n; i++) {
for (j = 0; j <= MAX_W; j++) {
if (i == 0 || j == 0) { // 边界条件
dp[i][j] = 0;
} else if (j < w[i - 1]) { // 背包装不下第i个物品
dp[i][j] = dp[i - 1][j];
} else { // 背包装得下第i个物品
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i - 1]] + v[i - 1]);
}
}
}
}
int main() {
int i, j;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d%d", &w[i], &v[i]);
}
solve();
printf("%d\n", dp[n][MAX_W]);
return 0;
}
```
以上是 01 背包问题的 C 实现,动态规划过程详细注释在代码中。
阅读全文