body { font-family: ‘Microsoft YaHei UI‘, ‘Microsoft YaHei‘, SimSun, ‘Segoe UI‘, Tahoma, Helvetica, sans-serif, ‘Microsoft YaHei‘, Georgia, Helvetica, Arial, sans-serif, 宋体, PMingLiU, serif; font-size: 10.5pt; line-height: 1.5; }html, body { }h1 { font-size: 1.5em; font-weight: bold; }h2 { font-size: 1.4em; font-weight: bold; }h3 { font-size: 1.3em; font-weight: bold; }h4 { font-size: 1.2em; font-weight: bold; }h5 { font-size: 1.1em; font-weight: bold; }h6 { font-size: 1em; font-weight: bold; }img { border: 0px; max-width: 100%; height: auto !important; }blockquote { margin-top: 0px; margin-bottom: 0px; }table { border-collapse: collapse; border: 1px solid rgb(187, 187, 187); }td { border-collapse: collapse; border: 1px solid rgb(187, 187, 187); }.wiz-todo, .wiz-todo-img { width: 16px; height: 16px; cursor: default; padding: 0px 10px 0px 2px; vertical-align: -10%; -webkit-user-select: none; }.wiz-todo-label { display: inline-block; padding-top: 7px; padding-bottom: 6px; line-height: 1.5; }.wiz-todo-label-checked { color: rgb(102, 102, 102); }.wiz-todo-label-unchecked { text-decoration: initial; }.wiz-todo-completed-info { padding-left: 44px; display: inline-block; }.wiz-todo-avatar { width: 20px; height: 20px; vertical-align: -20%; margin-right: 10px; border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; }.wiz-todo-account, .wiz-todo-dt { color: rgb(102, 102, 102); }body { font-family: ‘Microsoft YaHei UI‘, ‘Microsoft YaHei‘, SimSun, ‘Segoe UI‘, Tahoma, Helvetica, sans-serif, ‘Microsoft YaHei‘, Georgia, Helvetica, Arial, sans-serif, 宋体, PMingLiU, serif; font-size: 10.5pt; line-height: 1.5; }html, body { }h1 { font-size: 1.5em; font-weight: bold; }h2 { font-size: 1.4em; font-weight: bold; }h3 { font-size: 1.3em; font-weight: bold; }h4 { font-size: 1.2em; font-weight: bold; }h5 { font-size: 1.1em; font-weight: bold; }h6 { font-size: 1em; font-weight: bold; }img { border: 0px; max-width: 100%; height: auto !important; }blockquote { margin-top: 0px; margin-bottom: 0px; }table { border-collapse: collapse; border: 1px solid rgb(187, 187, 187); }td { border-collapse: collapse; border: 1px solid rgb(187, 187, 187); }.wizimgdragresize { position: absolute; z-index: 1000; border: 1px solid black; background-color: white; }.wizimgdragresize-lt { cursor: nw-resize; }.wizimgdragresize-tm { cursor: n-resize; }.wizimgdragresize-rt { cursor: ne-resize; }.wizimgdragresize-lm { cursor: w-resize; }.wizimgdragresize-rm { cursor: e-resize; }.wizimgdragresize-lb { cursor: sw-resize; }.wizimgdragresize-bm { cursor: s-resize; }.wizimgdragresize-rb { cursor: se-resize; }
.wiz-todo, .wiz-todo-img { width: 16px; height: 16px; cursor: default; padding: 0px 10px 0px 2px; vertical-align: -10%; -webkit-user-select: none; }.wiz-todo-label { display: inline-block; padding-top: 7px; padding-bottom: 6px; line-height: 1.5; }.wiz-todo-label-checked { color: rgb(102, 102, 102); }.wiz-todo-label-unchecked { text-decoration: initial; }.wiz-todo-completed-info { padding-left: 44px; display: inline-block; }.wiz-todo-avatar { width: 20px; height: 20px; vertical-align: -20%; margin-right: 10px; border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; }.wiz-todo-account, .wiz-todo-dt { color: rgb(102, 102, 102); }body { font-family: ‘Microsoft YaHei UI‘, ‘Microsoft YaHei‘, SimSun, ‘Segoe UI‘, Tahoma, Helvetica, sans-serif, ‘Microsoft YaHei‘, Georgia, Helvetica, Arial, sans-serif, 宋体, PMingLiU, serif; font-size: 10.5pt; line-height: 1.5; }html, body { }h1 { font-size: 1.5em; font-weight: bold; }h2 { font-size: 1.4em; font-weight: bold; }h3 { font-size: 1.3em; font-weight: bold; }h4 { font-size: 1.2em; font-weight: bold; }h5 { font-size: 1.1em; font-weight: bold; }h6 { font-size: 1em; font-weight: bold; }img { border: 0px; max-width: 100%; height: auto !important; }blockquote { margin-top: 0px; margin-bottom: 0px; }table { border-collapse: collapse; border: 1px solid rgb(187, 187, 187); }td { border-collapse: collapse; border: 1px solid rgb(187, 187, 187); }.wizimgdragresize { position: absolute; z-index: 1000; border: 1px solid black; background-color: white; }.wizimgdragresize-lt { cursor: nw-resize; }.wizimgdragresize-tm { cursor: n-resize; }.wizimgdragresize-rt { cursor: ne-resize; }.wizimgdragresize-lm { cursor: w-resize; }.wizimgdragresize-rm { cursor: e-resize; }.wizimgdragresize-lb { cursor: sw-resize; }.wizimgdragresize-bm { cursor: s-resize; }.wizimgdragresize-rb { cursor: se-resize; }body { font-family: ‘Microsoft YaHei UI‘, ‘Microsoft YaHei‘, SimSun, ‘Segoe UI‘, Tahoma, Helvetica, sans-serif, ‘Microsoft YaHei‘, Georgia, Helvetica, Arial, sans-serif, 宋体, PMingLiU, serif; font-size: 10.5pt; line-height: 1.5; }html, body { }h1 { font-size: 1.5em; font-weight: bold; }h2 { font-size: 1.4em; font-weight: bold; }h3 { font-size: 1.3em; font-weight: bold; }h4 { font-size: 1.2em; font-weight: bold; }h5 { font-size: 1.1em; font-weight: bold; }h6 { font-size: 1em; font-weight: bold; }img { border: 0px; max-width: 100%; height: auto !important; }blockquote { margin-top: 0px; margin-bottom: 0px; }table { border-collapse: collapse; border: 1px solid rgb(187, 187, 187); }td { border-collapse: collapse; border: 1px solid rgb(187, 187, 187); }.wiz-todo, .wiz-todo-img { width: 16px; height: 16px; cursor: default; padding: 0px 10px 0px 2px; vertical-align: -10%; -webkit-user-select: none; }.wiz-todo-label { display: inline-block; padding-top: 7px; padding-bottom: 6px; line-height: 1.5; }.wiz-todo-label-checked { color: rgb(102, 102, 102); }.wiz-todo-label-unchecked { text-decoration: initial; }.wiz-todo-completed-info { padding-left: 44px; display: inline-block; }.wiz-todo-avatar { width: 20px; height: 20px; vertical-align: -20%; margin-right: 10px; border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; }.wiz-todo-account, .wiz-todo-dt { color: rgb(102, 102, 102); }body { font-family: ‘Microsoft YaHei UI‘, ‘Microsoft YaHei‘, SimSun, ‘Segoe UI‘, Tahoma, Helvetica, sans-serif, ‘Microsoft YaHei‘, Georgia, Helvetica, Arial, sans-serif, 宋体, PMingLiU, serif; font-size: 10.5pt; line-height: 1.5; }html, body { }h1 { font-size: 1.5em; font-weight: bold; }h2 { font-size: 1.4em; font-weight: bold; }h3 { font-size: 1.3em; font-weight: bold; }h4 { font-size: 1.2em; font-weight: bold; }h5 { font-size: 1.1em; font-weight: bold; }h6 { font-size: 1em; font-weight: bold; }img { border: 0px; max-width: 100%; height: auto !important; }blockquote { margin-top: 0px; margin-bottom: 0px; }table { border-collapse: collapse; border: 1px solid rgb(187, 187, 187); }td { border-collapse: collapse; border: 1px solid rgb(187, 187, 187); }.wizimgdragresize { position: absolute; z-index: 1000; border: 1px solid black; background-color: white; }.wizimgdragresize-lt { cursor: nw-resize; }.wizimgdragresize-tm { cursor: n-resize; }.wizimgdragresize-rt { cursor: ne-resize; }.wizimgdragresize-lm { cursor: w-resize; }.wizimgdragresize-rm { cursor: e-resize; }.wizimgdragresize-lb { cursor: sw-resize; }.wizimgdragresize-bm { cursor: s-resize; }.wizimgdragresize-rb { cursor: se-resize; }
贪心算法问题:
活动安排:
见《算法导论》一书P238.对于活动的安排问题理解:
.由知Aij表示在活动i的开始后,活动j结束前的活动安排。则由知
Aij=Aik+ak+Akj.由知
Aik表示在活动i结束后,活动k开始前的活动数。
Akj表示在活动k结束后,活动j开始前的活动数。
因此不包含活动 ak
- 最早结束活动算法。
/*
入口参数:
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};
? 最晚开始活动的一种贪心算法。在上述数组中,己经对活动进行了排序,排序的规则是按活动开始顺序,活动开始晚的排在前面,开始早的排在后面。
这就后办了,你从后面往前面走。因为是按活动的结束时间进行排序,因此,我们相当于对活动的时间长度进行了考虑,想一下,有个活动它开始得早,但是
却结束得晚,只要一选中它,则其它的活动就没得选了。因此,在按活动进行排序是必要的。每次取当前活动的开始时间与另上一些活动的结束时间进行比较
。由于开始时间是进行排过序的。则知开始时间晚的一般来说活动时间不长。然后另外的活动由于是按开始时间从晚到早的排序,则在它向后滑时,它的开始时间晚,结束时间也早。那么它是理想的选择。
算法对“贪心”的体现
由知在“最早结束”的算法中,由于我们是首先对活动的结束时间进行了一次排序,由早到晚,因此,我们在后面的选择的时候
总是优先选择结束时间早的(由于我们是对数组从前往后移),但是同时它的起始时间是大于当前我们活动的结束时间。因此它的活动、
时间长度相对来说是最短的,也就是局部最优解。
同理,对“最晚开始”的算法中。我们首先以活动的开始时间按大到小的顺序进行排序。然后从活动后往前开始。优先取活动开始时
间最晚的。同时我们所选活动的开始时间应该是小于当前活动的结束时间的。则其活动长度相对来说是最优的。因此。贪心地洗择活动
时间较短的活动。、