标签:版本 inter 一个 sub task 选择 auto opened 实现
【问题描述】
给定n个活动,其中的每个活动ai包含一个起始时间si与结束时间fi。设计与实现算法从n个活动中找出一个最大的相互兼容的活动子集S。
要求:分别设计动态规划与贪心算法求解该问题。其中,对贪心算法分别给出递归与迭代两个版本的实现。
1 package org.xiu68.exp.exp7; 2 3 public class Task{ 4 public int startTime; //开始时间 5 public int endTime; //结束时间 6 7 public Task(int startTime,int endTime){ 8 this.startTime=startTime; 9 this.endTime=endTime; 10 } 11 }
1 package org.xiu68.exp.exp7; 2 3 import java.util.ArrayList; 4 5 public class Exp7_2_1 { 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 ArrayList<Task> tasks=new ArrayList<>(); 9 tasks.add(new Task(1,5)); 10 tasks.add(new Task(2,4)); 11 tasks.add(new Task(3,6)); 12 tasks.add(new Task(5,8)); 13 intervalSchedule(tasks); 14 } 15 16 public static void intervalSchedule(ArrayList<Task> tasks){ 17 //按结束时间从小到大进行排序 18 tasks.sort((t1,t2)->{ 19 if(t1.endTime<=t2.endTime) 20 return -1; 21 else 22 return 1; 23 }); 24 25 Task[] t = new Task[tasks.size()]; 26 tasks.toArray(t); 27 int result = 0; 28 if(t.length>=1){ 29 result=1+intervalRecuisive(t, 0, t.length-1); 30 } 31 System.out.println("最大区间个数为: "+result); 32 } 33 public static int intervalRecuisive(Task[] task,int i,int j){ 34 int m=i+1; 35 //下一个任务与前面的任务不兼容 36 while(m<=j && task[m].startTime<task[i].endTime) 37 m++; 38 //已经没有任务与前面任务兼容 39 if(m<=j) 40 return 1+intervalRecuisive(task, m, j); 41 else 42 return 0; 43 } 44 }
1 package org.xiu68.exp.exp7; 2 3 import java.util.ArrayList; 4 5 public class Exp7_2_2 { 6 7 //区间调度的迭代版本(最大区间个数) 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub 10 ArrayList<Task> tasks=new ArrayList<>(); 11 tasks.add(new Task(6,9)); 12 tasks.add(new Task(6,7)); 13 tasks.add(new Task(5,6)); 14 tasks.add(new Task(4,5)); 15 intervalSchedule(tasks); 16 } 17 18 public static void intervalSchedule(ArrayList<Task> tasks){ 19 //按结束时间从小到大进行排序 20 tasks.sort((t1,t2)->{ 21 if(t1.endTime<=t2.endTime) 22 return -1; 23 else 24 return 1; 25 }); 26 27 int result=0,end=0; 28 for(int i=0;i<tasks.size();i++){ //每次选择结束时间最早的任务 29 if(tasks.get(i).startTime>=end){ //如果任务之间相互兼容 30 result+=1; 31 end=tasks.get(i).endTime; 32 } 33 } 34 System.out.println("最大区间个数为: "+result); 35 } 36 }
标签:版本 inter 一个 sub task 选择 auto opened 实现
原文地址:http://www.cnblogs.com/xiu68/p/7988554.html