实现0-1背包的动态规划迭代算法c
时间: 2024-05-04 15:20:07 浏览: 73
下面是实现0-1背包的动态规划迭代算法的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 返回两个数中较大的数
int max(int a, int b) {
return (a > b) ? a : b;
}
// 实现0-1背包的动态规划迭代算法
int knapsack(int W, int wt[], int val[], int n) {
int i, j;
int **K = (int **)malloc((n+1) * sizeof(int *));
for (i = 0; i <= n; i++) {
K[i] = (int *)malloc((W+1) * sizeof(int));
}
// 构建 K[][] 数组
for (i = 0; i <= n; i++) {
for (j = 0; j <= W; j++) {
if (i == 0 || j == 0) {
K[i][j] = 0;
} else if (wt[i-1] <= j) {
K[i][j] = max(val[i-1] + K[i-1][j-wt[i-1]], K[i-1][j]);
} else {
K[i][j] = K[i-1][j];
}
}
}
// 返回最大价值
int result = K[n][W];
// 释放动态分配的内存
for (i = 0; i <= n; i++) {
free(K[i]);
}
free(K);
return result;
}
int main() {
int val[] = {60, 100, 120};
int wt[] = {10, 20, 30};
int W = 50;
int n = sizeof(val)/sizeof(val[0]);
printf("0-1背包问题的最大价值为:%d\n", knapsack(W, wt, val, n));
return 0;
}
```
该算法的时间复杂度为 $O(nW)$,其中 $n$ 是物品的数量,$W$ 是背包的容量。在实际应用中,常常采用空间压缩的方法,将二维数组压缩为一维数组,从而将空间复杂度降低为 $O(W)$。
阅读全文