标签:
/*
入口参数:
k:第k个活动
len:总的活动
start_time:活动的开始时间
end_time:活动的结束时间
注释:
本方法采用贪心算法解决活动安排的问题,有两张表分别表示活动的开始时间和结束时间。
于是每次都判断活动k是否合适。于是只有当活动m的开始时间大于活动k的结束时间时才
是合适的。
*/
void dynamicPlan(int k,int len,int *start_time,int *end_time){
int m=k+1;
while(m<=len&&start_time[m]<end_time[k]){
m++;
}
if(m<=len){
std::cout<<m<<std::endl;
std::cout<<start_time[m]<<std::endl;
std::cout<<end_time[m]<<std::endl;
std::cout<<std::endl;
dynamicPlan(m,len,start_time,end_time);
}
}
int start_time[11]={1,3,0,5,3,5,6,8,8,2,12};
int end_time[11]={4,5,6,7,9,9,10,11,12,14,16};
这是一个简单的数据集。其中Si表示活动的开始时间,fi,表示的是活动的结束时间。但是注意fi是经过排序处理的,否则将出现如下情况。如其中有某一活动开始时间为3但是结束时间为11。则明显是不行的。因为在上面的算法中,总是优先执行开始时间较早的那个活动。因此在计算前务必对结束时间进行排序。这样。总是那些时间短的优先在前面进行选择。
- 最晚开始活动的算法
void dynamicPlan_endtime(int k,int len,int *start_time,int *end_time){
int m=k+1;
while(m<=len&&end_time[m]>start_time[k]){
m++;
}
if(m<=len){
std::cout<<m+1<<std::endl;
std::cout<<"start time->"<<start_time[m]<<std::endl;
std::cout<<" end time->"<<end_time[m]<<std::endl;
dynamicPlan_endtime(m,len,start_time,end_time);
}
}
如上图代码部分,按最晚开始活动的时间算法进行。
int start_time_1[11]={12,8,8,6,5,5,3,3,2,1,0};
int end_time_1[11]={16,14,11,10,7,9,9,5,12,4,6};
? 最晚开始活动的一种贪心算法。在上述数组中,己经对活动进行了排序,排序的规则是按活动开始顺序,活动开始晚的排在前面,开始早的排在后面。这就后办了,你从后面往前面走。因为是按活动的结束时间进行排序,因此,我们相当于对活动的时间长度进行了考虑,想一下,有个活动它开始得早,但是却结束得晚,只要一选中它,则其它的活动就没得选了。因此,在按活动进行排序是必要的。每次取当前活动的开始时间与另上一些活动的结束时间进行比较。由于开始时间是进行排过序的。则知开始时间晚的一般来说活动时间不长。然后另外的活动由于是按开始时间从晚到早的排序,则在它向后滑时,它的开始时间晚,结束时间也早。那么它是理想的选择。算法对“贪心”的体现
由知在“最早结束”的算法中,由于我们是首先对活动的结束时间进行了一次排序,由早到晚,因此,我们在后面的选择的时候总是优先选择结束时间早的(由于我们是对数组从前往后移),但是同时它的起始时间是大于当前我们活动的结束时间。因此它的活动、时间长度相对来说是最短的,也就是局部最优解。同理,对“最晚开始”的算法中。我们首先以活动的开始时间按大到小的顺序进行排序。然后从活动后往前开始。优先取活动开始时间最晚的。同时我们所选活动的开始时间应该是小于当前活动的结束时间的。则其活动长度相对来说是最优的。因此。贪心地洗择活动时间较短的活动。、
标签:
原文地址:http://www.cnblogs.com/yml435/p/4655582.html