好的,以下是几道动态规划的题目及其参考答案,使用C语言实现:
1. **斐波那契数列**:
- 问题描述:计算第n个斐波那契数。
- 参考代码:
#include <stdio.h>
int fibonacci(int n) {
if (n <= 1) return n;
int dp[n+1];
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
int main() {
int n = 10; // 计算第10个斐波那契数
printf("Fibonacci(%d) = %d\n", n, fibonacci(n));
return 0;
}
2. **01背包问题**:
- 问题描述:给定几个物品,每个有重量和价值,求最大价值,限制是总重量不超过Capacity。
- 参考代码:
#include <stdio.h>
int knapsack(int weight[], int value[], int n, int Capacity) {
int dp[n+1][Capacity+1];
for (int i = 0; i <= n; i++) {
for (int w = 0; w <= Capacity; w++) {
if (i == 0 || w == 0) {
dp[i][w] = 0;
} else if (weight[i-1] <= w) {
dp[i][w] = (value[i-1] + dp[i-1][w-weight[i-1]] > dp[i-1][w]) ?
value[i-1] + dp[i-1][w-weight[i-1]] : dp[i-1][w];
} else {
dp[i][w] = dp[i-1][w];
}
}
}
return dp[n][Capacity];
}
int main() {
int value[] = {60, 100, 120};
int weight[] = {10, 20, 30};
int Capacity = 50;
int n = sizeof(value) / sizeof(value[0]);
printf("Maximum value in Knapsack = %d\n", knapsack(weight, value, n, Capacity));
return 0;
}
3. **最长公共子序列**:
- 问题描述:找出两个字符串的最长公共子序列的长度。
- 参考代码:
#include <stdio.h>
#include <string.h>
int lcs(char *X, char *Y, int m, int n) {
int L[m+1][n+1];
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; j++) {
if (i == 0 || j == 0) {
L[i][j] = 0;
} else if (X[i-1] == Y[j-1]) {
L[i][j] = L[i-1][j-1] + 1;
} else {
L[i][j] = (L[i-1][j] > L[i][j-1]) ? L[i-1][j] : L[i][j-1];
}
}
}
return L[m][n];
}
int main() {
char X[] = "ABCBDAB";
char Y[] = "BDCAB";
int m = strlen(X);
int n = strlen(Y);
printf("Length of LCS = %d\n", lcs(X, Y, m, n));
return 0;
}
这些题目从基础的斐波那契数列到稍复杂的01背包问题和最长公共子序列问题,能够帮助巩固动态规划的理解。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |