问题描述:
设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一个资源(如演讲会场),而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间Si和一个结束时间Fi,且Si<Fi。如果选择了活动i,则他在改时间区间[Si,Fi]内占用资源,若区间[Si,Fi] 和区间[Sj,Fj]不相交,则称活动i与活动j是相容的。活动安排问题是要求在所给的活动集合范围内选出最大的相容的活动子集。
源代码:
import java.util.LinkedList;
public class 活动安排问题 {
int n;
LinkedList<Integer> start;
LinkedList<Integer> finish;
boolean A[];
private 活动安排问题(int n,LinkedList<Integer> start,LinkedList<Integer> finish,boolean A[])
{
this.n=n;
this.start=start;
this.finish=finish;
this.A=A;
}
private static boolean[] run(int n,LinkedList start,LinkedList finish,boolean A[],int 会场标号) {
boolean x[]=new boolean[start.size()];
int j=0;
if(会场标号==1) {//若为第一个会场安排
j=1;
}
else {//为23456会场安排则寻找第一个未被安排的活动
for(int i=2;i<A.length;i++)
if(!A[i]) {
j=i;
break;}
}
A[j]=true;x[j]=true;
for(int i=j+1;i<A.length;i++) {
if(!A[i]&&(start.get(i)>=finish.get(j))) {
x[i]=true;j=i;A[i]=true;
}
}
return x;
}
private static void show(LinkedList s,LinkedList f) {
for(int i=1;i<f.size();i++)
System.out.println(i+" 号活动"+" 开始时间:"+s.get(i)+" 结束时间:"+f.get(i));
System.out.println();
}
private static void sort(LinkedList start,LinkedList finish) {
for(int i=1;i<finish.size();i++)
for(int j=i;j<finish.size();j++) {
if(finish.get(j)<finish.get(i)) {
int tempf=finish.get(i);
finish.set(i,finish.get(j));
finish.set(j,tempf);
int temps=start.get(i);
start.set(i,start.get(j));
start.set(j,temps);
}
}
}
private static boolean isover(boolean A[]) {
for(int i=1;i<A.length;i++)
if(!A[i])
return false;
return true;
}
public static void main(String args[]) {//主函数
int 会场标号=1;
LinkedList<Integer> start=new LinkedList<Integer>() {{
add(0);add(27);add(12);add(36);add(1);add(25);
}};
LinkedList<Integer> finish=new LinkedList<Integer>() {{
add(0);add(80);add(28);add(50);add(23);add(35);
}};
int n=start.size();
boolean A[]=new boolean[n];
System.out.println("排序前活动信息为:");
show(start,finish);
System.out.println("按结束时间升序排序后活动信息为:");
sort(start,finish);
show(start,finish);
活动安排问题 problem=new 活动安排问题(n,start,finish,A);
while(!isover(A)) {
boolean x[]=new boolean[start.size()];
x=run(n, start, finish, A,会场标号);
System.out.println("会场"+会场标号+"活动安排如下:");
int j=1;//活动次序记录
for(int i=1;i<x.length;i++) {
if(x[i]) {
System.out.println
("第"+j+"个活动为:"+""+i+"号活动 "+"开始时间:"+start.get(i)+" 结束时间:"+finish.get(i)+"");
j++; }
}
会场标号++;
System.out.println();
}
}
}