贪心算法-活动选择问题

需要阅读这篇代码的同学应该都知道贪心算法的定义吧,所以这里就不赘述什么叫贪心算法了。如果确实不知道什么是贪心算法,可以去看一下《算法导论》,问度娘也是挺好的。
下面简述一下活动选择问题:你是一个场地管理员,你收到的很多的活动申请,每个活动的开始时间和结束时间会有交错,也就是说有些活动不能同时举办,你需要做的就是在规划一个能举办尽可能多的活动方案。
首先介绍本代码中使用的活动文件Config.ini(不要吐嘈文件名字及格式),里面每一行都代表了一个活动的开始时间和结束时间,具体如下:
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14
下面的代码就是实现对文件中的活动申请使用贪心算法进行规划,选出最佳的方案。

/*
 *
 *          Author: StoryMonster
 *Last Change Date: 2016/6/28
 */
#include <iostream>
#include <stdlib.h>
#include <stdio.h>

typedef struct Activity
{
    int StartTime;
    int EndTime;
    int index;
    struct Activity * next;
} Activity;
Activity *head = (Activity *)malloc(sizeof(Activity));
int NodeCount = 0;

void InsertActivity(Activity *act)
{
    NodeCount++;
    if(head == NULL)
    {
        head = act;
        return ;
    }
    Activity *p = head;
    while(p->next != NULL)  p = p->next;
    p->next = act;
}
void DeleteActivity(Activity *act)
{
    NodeCount--;
    if(act == head)
    {
        head = head->next;
    }
    else
    {
        Activity *p = head;
        while(p->next != act) p = p->next;
        p->next = act->next;
    }
    free(act);
}
void ReadConfigFile(void)
{
    FILE *fp = fopen("Config.ini","rb");
    if(!fp)
    {
        std::cout << "Open Config.ini failed"<<std::endl;
        fp = NULL;
        return ;
    }
    int index = 0;
    while(1)
    {
        Activity *act = (Activity *)malloc(sizeof(Activity));
        int n = fscanf(fp,"%d %d",&act->StartTime,&act->EndTime);
        if(n < 2)
        {
            free(act);
            break;
        }
        act->index = ++index;
        act->next = NULL;
        InsertActivity(act);
    }
    fclose(fp);
    fp = NULL;

}
void GreedyAlgorithm(int startTime)
{
    Activity * p = head;
    while(p!=NULL)
    {
        if(p->StartTime < startTime)
        {
            Activity *p1 = p;
            DeleteActivity(p1);
        }
        p = p->next;
    }
    if(head == NULL) return ;
    p = head->next;
    Activity *CurrentBest = head;
    while(p!=NULL)
    {
        if(p->EndTime < CurrentBest->EndTime)
        {
            CurrentBest = p;
        }
        p = p->next;
    }
    std::cout << "Activity "<<CurrentBest->index << " Start time: "<<CurrentBest->StartTime<<" End time: "<<CurrentBest->EndTime<<std::endl; 
    int time = CurrentBest->EndTime;
    DeleteActivity(CurrentBest);
    CurrentBest = NULL;
    GreedyAlgorithm(time);
}
int main()
{
    head = NULL;
    ReadConfigFile();
    std::cout << "Greedy algorithm result:"<<std::endl;
    GreedyAlgorithm(0);
    return 0;
}

活动选择问题是使用贪心算法的经典问题,对于理解贪心算法很有帮助。针对贪心算法的实践,我还有一篇”贪心算法-Huffman编码”。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值