我正在尝试使用贪婪算法解决“活动选择”问题。我的代码对某些输入失败。我正在根据finish_time_list对活动列表进行排序。
对于以下输入,代码无法正常工作:
activity_list = [1、2、3、4、5、6]
start_time_list = [5,4,8,2,3,1]
finish_time_list = [13,6,16,7,7,5,4]
我排序的活动列表:[6、5、2、4、1、3]
def find_maximum_activities(activity_list,start_time_list, finish_time_list):
selected =[]
activity_tmp_list = [x for _,x in sorted(zip(finish_time_list,activity_list))]
#the first activity is always selected
i=0
#print(i)
selected.append(activity_tmp_list[i])
#consider rest of Activities
for j in range(1,len(activity_list)):
if start_time_list[j]>=finish_time_list[i]:
print(j)
selected.append(activity_tmp_list[j])
i=j
return selected
activity_list=[1, 2, 3, 4, 5, 6]
start_time_list=[5, 4, 8, 2, 3, 1]
finish_time_list=[13, 6, 16, 7, 5, 4]
print("Activities:",activity_list)
print("Start time of the activities:",start_time_list)
print("Finishing time of the activities:", finish_time_list)
result=find_maximum_activities(activity_list,start_time_list, finish_time_list)
print("The maximum set of activities that can be completed:",result)
预期输出:[6,1]
实际结果:[6]
答案 0 :(得分:1)
问题在于,在您的for
循环中,您正在将每个开始时间与finish_time_list[i]
进行比较。 i=0
每次循环运行,在这种情况下,finish_time_list[0]
为13
,这是最后一个结束,因此if
将永远不会变为真。
另一个问题是,您正在检查j
是否经过start_time_list
,但是您从j
附加了相同的activity_tmp_list
,并对其进行了排序。由于已经对它进行了排序,因此活动索引不会像您想要的那样排列。
更高级的问题是,您仅将活动编号存储在selected
数组中,与活动开始或结束的时间无关。在不知道有关已选择内容的信息的情况下,您无法决定是否添加其他活动。我建议您制作一个包含其标签,开始时间和结束时间的Activity
类,或将selected
设为2D矩阵,以便在选择第一个活动后,其外观类似于{{1 }},其中包含标签,标签的起点和终点。或至少,假设您要保留贪婪算法,只需标签和结束时间即可。
如果还有其他问题,请告诉我。