活动安排问题贪心算法

问题描述:

设有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();
}

}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值