请用c++写一写动态规划
时间: 2024-01-18 21:03:53 浏览: 71
下面是动态规划的一个例子,用 C 语言实现:
```c
#include <stdio.h>
int max(int a, int b) {
return a > b ? a : b;
}
int knapsack(int W, int wt[], int val[], int n) {
int i, w, k[n+1][W+1];
for (i = 0; i <= n; i++) {
for (w = 0; w <= W; w++) {
if (i == 0 || w == 0) {
k[i][w] = 0;
} else if (wt[i-1] <= w) {
k[i][w] = max(val[i-1] + k[i-1][w-wt[i-1]], k[i-1][w]);
} else {
k[i][w] = k[i-1][w];
}
}
}
return k[n][W];
}
int main() {
int val[] = {60, 100, 120};
int wt[] = {10, 20, 30};
int W = 50;
int n = sizeof(val) / sizeof(val[0]);
printf("Maximum value that can be obtained = %d", knapsack(W, wt, val, n));
return 0;
}
```
这是经典的 0/1 背包问题,即给定一些物品和一个背包,每种物品都有一个重量和价值,需要选择一些物品放入背包中,使得物品的总重量不超过背包的容量,同时价值最大化。动态规划的思路是定义一个二维数组,用 k[i][w] 表示前 i 个物品中选择总重量不超过 w 的最大价值,逐步计算出 k[n][W],即为最终的结果。具体的状态转移方程如下:
k[i][w] = 0, if i = 0 or w = 0
k[i][w] = k[i-1][w], if wt[i-1] > w
k[i][w] = max(val[i-1] + k[i-1][w-wt[i-1]], k[i-1][w]), if wt[i-1] <= w
其中,wt[i-1] 和 val[i-1] 分别表示第 i 个物品的重量和价值。这个例子比较简单,但是可以看到动态规划的思想是通用的,可以解决很多实际问题,比如最长公共子序列、编辑距离等。
阅读全文