如何安排下列活动使得使用的活动场所最少,并给出具体的安排方案
活动 | a | b | c | d | e | f | g |
开始 | 0 | 3 | 4 | 9 | 7 | 1 | 6 |
完成 | 2 | 7 | 7 | 11 | 10 | 5 | 8 |
我们可以通过开始时间对活动进行排序以便于尽量让一个场所排更多的活动,第一轮通过比较前一个活动的的结束时间和下一个活动的开始时间比较,来判断此活动能否加入当前场所,若可以则加入此场所,若不可以,则存入另一个组合加入下一轮的比较,每一轮会产生一个新场所。
利用贪心算法思想通过一轮一轮的筛选,直到没有活动未被安排截止,每一轮的筛选都代表的场所,通过对开始时间排序可以让一个场所尽可能的安排更多活动。
ac=[['a',0,2],['b',3,7],['c',4,7],['d',9,11],['e',7,10],['f',1,5],['g',6,8]]#将活动存入数组
ac.sort(key=lambda x:x[1],reverse=False)#对数组按照开始时间进行从小到大的排序
place=[[0,0,0]]#用来存入此轮可以当前场所的活动,初始值设置0以便于比较
left=[]#用来接收当前被此场所淘汰的活动
arrange=[]#接收每一轮活动安排方案,每一轮代表一个场所
while True:
for i in ac:
if i[1]>=place[-1][2]:#通过比较此活动的开始时间和当前场所最后一个活动的结束时间来判断此活动能否加入当前场所
place.append(i)
else:
left.append(i)#被淘汰的活动将进入下一个场地的比较
ac=pass[:]#接收上一场所未被安排的活动以便进入下一轮循环
arrange.append(place)#添加当前场所的安排的总活动
left=[]
place=[[0,0,0]]#将pass和place回复初始以便重新接收下一轮参数
if len(ac)==0:#当ac接收的未被安排的活动为0时则全部活动已被安排跳出循环
break
print("活动安排为{},所需场所数为{}".format(arrange,len(arrange)))
运行结果
[0,0,0]是初始设置的,不代表一活动,
则可以分为三个场所
场所一:a,b,e
场所2:f,g,d
场所3:c