需要阅读这篇代码的同学应该都知道贪心算法的定义吧,所以这里就不赘述什么叫贪心算法了。如果确实不知道什么是贪心算法,可以去看一下《算法导论》,问度娘也是挺好的。
下面简述一下活动选择问题:你是一个场地管理员,你收到的很多的活动申请,每个活动的开始时间和结束时间会有交错,也就是说有些活动不能同时举办,你需要做的就是在规划一个能举办尽可能多的活动方案。
首先介绍本代码中使用的活动文件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编码”。