用c++动态规划法解决01背包问题
时间: 2023-09-16 21:15:00 浏览: 113
好的,下面是用C语言实现动态规划法解决01背包问题的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义物品结构体
typedef struct Item {
int weight; // 物品重量
int value; // 物品价值
} Item;
// 动态规划函数
int knapsack(Item* items, int n, int W) {
int i, w;
int** K = (int**) malloc((n + 1) * sizeof(int*)); // 申请二维数组
for (i = 0; i <= n; i++) {
K[i] = (int*) malloc((W + 1) * sizeof(int));
}
// 填充二维数组
for (i = 0; i <= n; i++) {
for (w = 0; w <= W; w++) {
if (i == 0 || w == 0) { // 初始化第一行和第一列为0
K[i][w] = 0;
} else if (items[i - 1].weight <= w) { // 当前物品可以装入背包
int val1 = items[i - 1].value + K[i - 1][w - items[i - 1].weight]; // 装入该物品的最大价值
int val2 = K[i - 1][w]; // 不装入该物品的最大价值
K[i][w] = (val1 > val2) ? val1 : val2; // 取最大值
} else { // 当前物品无法装入背包
K[i][w] = K[i - 1][w];
}
}
}
int result = K[n][W]; // 获取最终结果
// 释放动态申请的内存
for (i = 0; i <= n; i++) {
free(K[i]);
}
free(K);
return result;
}
int main() {
int W = 50; // 背包最大承重
Item items[] = {{10, 60}, {20, 100}, {30, 120}}; // 物品数组
int n = sizeof(items) / sizeof(items[0]); // 物品数量
int max_value = knapsack(items, n, W); // 动态规划求解
printf("The maximum value is %d\n", max_value);
return 0;
}
```
上述代码中,我们定义了一个`Item`结构体,它包含了物品的重量和价值,然后我们通过`knapsack`函数进行动态规划求解,最后输出最大的价值。代码中使用了二维数组来存储物品的最大价值,其中`K[i][w]`表示前i个物品在承重为w的情况下的最大价值。在求解过程中,我们首先初始化第一行和第一列为0,然后根据当前物品是否可以装入背包进行状态转移,最后得到最终结果。
需要注意的是,动态申请的内存需要在程序结束后手动释放,以避免内存泄漏。
阅读全文