有N
个数字列表。从每个列表中选择k
个数字,然后返回可以这种方式形成的最大集合(无重复项)。如果可以使用多个相同大小的集合,则可以返回其中任何一个集合。
例如,如果N = 3,则k = 2,
l1: [1, 2, 3]
l2: [2, 7]
l3: [3]
然后最佳结果为[1, 3, 2, 7]
。从[1, 3]
选择l1
,从[2, 7]
选择l2
,从[3]
选择l3
。 (虽然还有其他选择,但结果集中的元素数量少于这个,所以这一个是最佳选择。)
我认为这是 NP-complete 问题,唯一的方法是枚举。
请详细说明。提前谢谢!
答案 0 :(得分:0)
这个问题可以用最大的二分匹配来解决。这是一个经典的算法,它的描述可以在互联网上轻松找到,所以我不会在这里包含它。
请注意,此算法是多项式时间,因此问题不是NP难。
二分匹配问题是:给定一个二分图,选择一组边,使每个顶点最多与一个选定边相邻,并且在可能的集中找到一个具有最大基数的边。
让我们建立一个二分图。在左侧部分,将出现输入中出现的所有不同数字的顶点。在右侧部分,每个列表将有k
个顶点。现在,"数字" vertex与所有" list"顶点,使列表包含数字。
现在请注意,此图表中最大匹配的基数正是您问题的答案:我们已经采用尽可能多的不同数字,而不会从任何单个列表中获取超过k
的数字。在这里,我们允许从列表中删除少于k
项,因为它无法增加答案。如有必要,您可以携带任何额外的(无用的)物品。
如果您对最大流量有所了解,可以考虑每个列表只添加一个顶点,使k
- 容量边缘下沉。这基本上是相同的,但会产生更快的渐近运行时间。