该算法是一个比较经典的算法,是关于活动的安排,题目是这样的:若干活动等待安排,每个活动有一个开始和结束的时间,要求选出一个活动的序列使得在指定的时间区间内能够完成更多的活动。
算法的代码如下:
#include <iostream> using namespace std; typedef struct active { int num; //活动编号 int starttime; //活动开始时间 int endtime; //活动结束时间 bool flag; } active; void SortActive(active *meeting,int num) { int tempnum,tempstarttime,tempendtime; for(int i=0;i<num-1;i++) for(int j=0;j<num-i-1;j++) if(meeting[j].endtime>meeting[j+1].endtime) { tempnum=meeting[j].num; tempstarttime=meeting[j].starttime; tempendtime=meeting[j].endtime; meeting[j].num=meeting[j+1].num; meeting[j].starttime=meeting[j+1].starttime; meeting[j].endtime=meeting[j+1].endtime; meeting[j+1].num=tempnum; meeting[j+1].starttime=tempstarttime; meeting[j+1].endtime=tempendtime; } } void SearchMostMeetingWay(active *meeting,int num) { SortActive(meeting,num); int j=0; meeting[j].flag=true; for(int i=1;i<num;i++) if(meeting[j].endtime<meeting[i].starttime) { meeting[i].flag=true; j=i; } else meeting[i].flag=false; } int main() { cout<<"Please input the num of active:"; int num,sum=0; cin>>num; active *meeting=new active[num]; for(int i=0;i<num;i++) { meeting[i].num=i+1; cout<<"Please input the starttime and endtime:"; cin>>meeting[i].starttime>>meeting[i].endtime; } SearchMostMeetingWay(meeting,num); for(int i=0;i<num;i++) if(meeting[i].flag==true) { cout<<meeting[i].num<<" "<<meeting[i].starttime<<" "<<meeting[i].endtime<<endl; sum++; } cout<<"The max num of active is "<<sum<<endl; return 0; }