c语言,实现动态规划
时间: 2023-07-13 19:12:03 浏览: 124
beibao-动态规划_背包问题动态规划_
动态规划(Dynamic Programming)是一种高效解决各种复杂问题的算法,它通常用于处理具有重叠子问题和最优子结构性质的问题。下面是一个使用 C 语言实现动态规划的例子:
假设有一个背包,它能够容纳一定重量的物品,现在有 n 个物品,每个物品有一个重量和一个价值,要求将这些物品放入背包中,使得背包中所放物品的总价值最大。假设物品的重量分别为 w1, w2, ..., wn,价值分别为 v1, v2, ..., vn,背包的容量为 W。可以使用以下的动态规划算法来解决这个问题:
1. 定义一个二维数组 dp[n+1][W+1],其中 dp[i][j] 表示前 i 个物品放入容量为 j 的背包中所能获得的最大价值。
2. 初始化 dp[0][j] 和 dp[i][0] 为 0。
3. 对于每个物品 i,遍历所有的背包容量 j:
- 如果当前物品的重量 wi 大于 j,则 dp[i][j] = dp[i-1][j],即不放入当前物品;
- 否则,可以选择放入当前物品或者不放入,取最大值: dp[i][j] = max(dp[i-1][j], dp[i-1][j-wi] + vi)。
4. 最终 dp[n][W] 就是问题的解,表示将所有物品放入容量为 W 的背包中所能获得的最大价值。
下面是 C 语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
int max(int a, int b) {
return a > b ? a : b;
}
int knapsack(int n, int W, int *w, int *v) {
// 初始化 dp 数组
int **dp = (int **)malloc((n+1) * sizeof(int *));
for (int i = 0; i <= n; i++) {
dp[i] = (int *)calloc(W+1, sizeof(int));
}
// 动态规划
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= W; j++) {
if (w[i-1] > j) {
dp[i][j] = dp[i-1][j];
} else {
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i-1]] + v[i-1]);
}
}
}
// 释放内存
for (int i = 0; i <= n; i++) {
free(dp[i]);
}
free(dp);
return dp[n][W];
}
int main() {
int n = 5;
int W = 10;
int w[] = {2, 3, 4, 5, 9};
int v[] = {3, 4, 5, 8, 10};
int result = knapsack(n, W, w, v);
printf("The maximum value is: %d\n", result);
return 0;
}
```
以上代码实现了一个简单的 0-1 背包问题,可以将其扩展到其他类型的动态规划问题中。
阅读全文