📜  活动选择问题的C程序|贪婪算法1(1)

📅  最后修改于: 2023-12-03 15:40:44.714000             🧑  作者: Mango

活动选择问题的C程序|贪婪算法1

该程序使用贪心算法来解决活动选择问题。活动选择问题是一个很经典的优化问题,目标是在时间允许的情况下选择最大数量的互相兼容的活动。

算法说明

在贪心算法中,我们假设每个活动都有一个权重或价值,我们尽可能选择具有最高权重或价值的活动。这种选择策略被称为“贪心”,因为我们每次选择的活动都是当前具有最大权重或价值的活动。

具体的,我们首先将活动按结束时间从早到晚排序,然后逐一遍历每个活动,选择结束时间最早且与之前已经选中的活动不冲突的活动。

代码实现
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100

int *selectActivities(int startTime[], int finishTime[], int n) {
    int i, j;
    int *activitySelected = (int *) malloc(sizeof(int) * MAX_SIZE);
    activitySelected[0] = 0;
    int k = 1;
    for (i = 1; i < n; i++) {
        if (startTime[i] >= finishTime[activitySelected[k - 1]]) {
            activitySelected[k++] = i;
        }
    }
    activitySelected[k] = -1;
    return activitySelected;
}

int main() {
    int startTime[MAX_SIZE] = {1, 3, 0, 5, 8, 5};
    int finishTime[MAX_SIZE] = {2, 4, 6, 7, 9, 9};
    int n = 6;
    int *activitySelected = selectActivities(startTime, finishTime, n);
    printf("Selected Activities:");
    for (int i = 0; activitySelected[i] != -1; i++) {
        printf(" %d", activitySelected[i]);
    }
    free(activitySelected);
    return 0;
}

程序中,selectActivities函数使用贪心算法实现活动选择。函数首先申请一个长度为MAX_SIZE的整型数组activitySelected,表示选中的活动序号。然后将activitySelected[0]赋值为0,表示初始选择第一个活动;接着遍历整个活动列表(即startTimefinishTime数组),如果当前活动的开始时间大于或等于之前选中的最后一个活动的结束时间,就将该活动加入到选中的列表activitySelected中;最后将activitySelected数组的最后一个元素设为-1,表示选中活动的结束。程序中最后调用selectActivities函数,并输出选中的活动序号。