01背包带备忘录递归c
时间: 2023-10-12 11:17:11 浏览: 124
01背包C语言
下面是使用备忘录递归实现的01背包问题的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 100
#define MAX_W 1000
int n, w[MAX_N], v[MAX_N];
int dp[MAX_N][MAX_W];
int max(int a, int b) {
return a > b ? a : b;
}
int search(int i, int j) {
if (dp[i][j] >= 0) {
return dp[i][j];
}
int res;
if (i == n) {
res = 0;
} else if (j < w[i]) {
res = search(i + 1, j);
} else {
res = max(search(i + 1, j), search(i + 1, j - w[i]) + v[i]);
}
dp[i][j] = res;
return res;
}
int solve(int W) {
memset(dp, -1, sizeof(dp));
return search(0, W);
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &w[i], &v[i]);
}
int W;
scanf("%d", &W);
printf("%d\n", solve(W));
return 0;
}
```
其中,dp数组用于记录搜索过程中的状态,dp[i][j]表示从第i个物品开始放置,剩余容量为j时的最大价值。如果搜索过程中已经计算过dp[i][j],则直接返回dp[i][j],否则继续搜索。
本算法的时间复杂度为O(nW),其中n为物品数量,W为背包容量。由于使用了备忘录,因此算法可以避免重复计算。
阅读全文