给出动态规划算法求解活动安排问题的c语言代码
时间: 2024-08-09 12:00:37 浏览: 63
动态规划算法通常用于解决最优化问题,例如活动安排问题,也被称为“0-1背包”或“课程表”问题的一种变体。在这种场景下,我们想要找到一种方案,使得在给定的一系列活动中选择一些参加,既能满足每项活动的要求(如持续时间、先决条件等),又使得总收益最大化。
以下是一个简单的C语言代码示例,它解决了活动安排问题中的0-1背包版本:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_EVENTS 20
#define MAX_TIME 24
bool canDo(int activity[], int n, int start_time, int end_time) {
for (int i = 0; i < n; i++) {
if (start_time >= activity[i] && start_time + activity[i] <= end_time)
return true;
}
return false;
}
int knapsack(int activity[], int n, int capacity) {
int dp[MAX_TIME+1][MAX_EVENTS+1];
bool done[MAX_TIME+1][MAX_EVENTS+1];
// 初始化第一行和第一列
for (int i = 0; i <= MAX_TIME; i++)
dp[i] = 0;
for (int j = 0; j <= MAX_EVENTS; j++)
done[i][j] = false;
// 动态规划填充过程
for (int i = 1; i <= MAX_TIME; i++) {
for (int j = 1; j <= n; j++) {
if (!canDo(activity, n, i - activity[j - 1], i)) {
dp[i][j] = dp[i - 1][j];
done[i][j] = done[i - 1][j];
} else {
dp[i][j] = max(dp[i - 1][j], dp[i - activity[j - 1]][j - 1] + activity[j - 1]);
done[i][j] = done[i - 1][j];
}
}
}
return dp[MAX_TIME][n];
}
int main() {
int activity[] = {1, 2, 3, 5};
int n = sizeof(activity) / sizeof(activity);
int capacity = 7;
int optimalSolution = knapsack(activity, n, capacity);
printf("The maximum benefit you can achieve is: %d\n", optimalSolution);
return 0;
}
```
这个代码首先定义了一个`canDo`函数来检查某时间段内是否可以包含所有活动,然后使用二维数组`dp`记录到每个时间点的最大收益,并通过`done`数组跟踪当前状态是否已计算过。最后在主函数中给出了具体的活动数组和容量,调用`knapsack`函数求解并打印结果。
阅读全文