给出n个任务和每个任务的开始和结束时间。找出可以完成的任务的最大数量,在同一时刻只能做一个任务。
例子:
下面的6个任务:
start[] = {1, 3, 0, 5, 8, 5};
finish[] = {2, 4, 6, 7, 9, 9};
最多可完成的任务是:
{0, 1, 3, 4}
分析:
贪婪的选择是总是选择下一个任务的完成时间至少在剩下的任务和开始时间大于或等于以前选择任务的完成时间。我们可以根据他们的任务完成时间,以便我们总是认为下一个任务是最小完成时间的任务。
1)按照完成时间对任务排序
2)选择第一个任务排序数组元素并打印。
3) 继续以下剩余的任务排序数组。
4)如果这一任务的开始时间大于先前选择任务的完成时间然后选择这个任务和打印。
具体实现代码如下所示:
/**
*@Title: MaxActivities.java
*@Package greedyalgorithm
*@Description: TODO
*@author peidong
*@date 2017-5-15 上午9:31:42
*@version V1.0
*/
packagegreedyalgorithm;
/**
* @ClassName: MaxActivities
* @Description: 贪心算法实例:多任务问题
* @date 2017-5-15 上午9:31:42
*
*/
publicclass MaxActivities {
/**
*
* @Title: printMaxActivities
* @Description: 最多任务选择
* @param start 任务开始时间数组
* @param end 任务结束时间数组
* @param n 任务总数
* @return void
* @throws
*/
public static voidprintMaxActivities(int[] start, int[] end, int n){
int i = 0; //初始任务
System.out.print(i + “”);//打印初始任务
//后续任务选择
for(int j = 1; j <n; j++){
//如果当前任务开始比前一个任务的结束时间大或相等,则打印此任务
if(start[j] >= end[i]){
System.out.print(j +” “);
i = j;
}
}
}
/**
*@Title: main
*@Description: 测试用例
*@param args
*@return void
*@throws
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] start = {1, 3, 0, 5, 8, 5};
int[] end = {2, 4, 6, 7, 9, 9};
int n = start.length;
printMaxActivities(start, end, n);
}
}