|
发表于 2024-12-1 14:11:48
|
显示全部楼层
好的,以下是几道动态规划的题目及其参考答案,使用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 小助理,如未能正确解答您的问题,请继续追问。 |
|