我遇到了这个看起来非常有趣的问题。有几部电影我们想要观看所有电影,但它们仅在以下时间显示:
movieA : 15
movieB : 14, 15, 17
movieC : 15, 17
movieD : 15, 20
我们可以在15,B在14,C在17和D在20观看A,所以可以观看它们。请注意,您不能在15岁时观看C,不可行。
您猜到的问题是,我们是否可以全部观看。
显然,我们可以通过回溯来解决它,尝试所有可能性。有更好的方法吗?我有一个想法,首先开始使用最少的可用时间的电影,这样我们可以更快地找到解决方案,如果有解决方案,最坏的情况时间复杂性仍然是相同的。
这个问题有更好的算法吗?
P.S。 正如@gen所说,我忘了指出每部电影都是1小时,所以如果你在14点看一部电影,你就不会错过15点的电影。谢谢你的询问。
答案 0 :(得分:7)
根据电影数量的限制和每部电影可能的不同时间的数量,您可以创建一个二分图,其中一侧是电影,另一侧是时间,并运行最大流量算法来确定最大匹配。如果可以在时间i
观看电影j
,则在图表中的相应节点之间添加边缘。
答案 1 :(得分:1)
看起来像二分图上的最大匹配问题。图表的顶点是一天中的两个独立集合'和电影片名'。图表的边缘是特定时间特定电影的放映。
根据Steven Skiena的算法设计手册,最着名的算法是Hopcroft-Karp算法,该算法在O(E * sqrt(V))中运行。 E是边数,即。放映次数。 V是顶点的数量,即。电影的数量加上电影放映时间的不同时间。在您的示例中,E = 8个放映,V = 4个电影+ 4个不同的时间= 8。
https://en.wikipedia.org/wiki/Hopcroft%E2%80%93Karp_algorithm
请注意,匹配的配方才有可能,因为您的电影都是从小时开始,持续一小时。它们要么完全一致,要么根本不重叠。
答案 2 :(得分:0)
WHILE list of movie times isn't empty
1. Sort movie showtime list in order of the number of showtimes.
2. Watch next movie according to this sort at the first available time.
3. Remove respective time from each movie showtime list and movie
from the movie list.
Python尝试:
A=[15,'A']
B=[14,15,17,'B']
C=[15,17,'C']
D=[15,20,'D']
movies=[A,B,C,D]
watchOrder = []
def f(x):
while x: # while x isnt empty
x=sorted(x, key=len)
watchOrder.append(x[0])
r = x[0][0]
x.remove(x[0])
for l in x:
if r in l:
l.remove(r)
f(movies)
print(watchOrder)