问题描述、
问题描述:有一个由n个活动组成的集合S = {a1, ..., an}
1. 这些活动使用同一个资源,而这个资源在某一时刻只供一个活动使用
2. 每个活动都有一个开始和结束时间si/fi;如果被选中,则任务ai发生在半开时间区间[si, fi)
3. 如果两个活动ai和aj不重叠,则称两个活动兼容
活动选择问题,希望选出一个最大兼容活动集
设计思路
设计思路:采用回溯求解算法,用数组s[N]来存放事件的开始及其结束时间,m[N]存放当前得到的最大兼容活动集,v[N]存放当前最大兼容活动集的开始机器结束时间,Vmax表示当前最大兼容活动集的活动数。若事件可进栈(与已在栈中元素无时间冲突),则进栈,若无事件可继续进栈,则此时活动总数与Vmax比较,若大于Vmax,则替换Vmax和v[N]和m[N],若i>n,则需退栈,若此时栈空,则结束运行并输出此时Vmax, v[N], m[N]。
数据结构:
s[N]来存放事件的开始及其结束时间,
m[N]存放当前得到的最大兼容活动集,
v[N]存放当前最大兼容活动集的开始机器结束时间
a[N]为工作数组,存放当前栈内活动,
Vmax表示当前最大兼容活动集的活动数
算法描述:
ARRANGE(s[N], m[N], v[N], a[N], Vmax)
Input(s[N])
Top<-0; i<-1;c<-0;
While(i<N) do
For j=0 to top
If(s[i]∈a[j]) then c=1, end(for)
If(c!=1) then
{a[top]=s[i];b[top]=I;top++;vi++}
C<-0;
If(vi>Vmax) then { Vmax=vi; v[t]=a[t]; m[t]=b[t]}
Else { if (i=N-1 AND top>0) then top