我遇到了下面描述的问题。你有什么好的解决方案或者这个问题只是“经典”或“已经解决”问题的另一种形式吗?
问题是:
有一些数字,例如。
A(1 8 9)
B(1 4 5)
C(2 4 6)
D(3 4 7)
E(2 10 11)
F(3 12 13)
有“A-F”六组。我们有数字“1,2,3,4,5,6,7,8,9,10,11,12,13”。 现在找到满足每个组的最小数量集必须至少具有该集合中的数字。对于检验,我们可以找到A为“1”,B为“1,4”,C为“2,4”,D为“4”,E为“2”的集合“1 4 2 13 12”, F有“12,13”。
但设置“1 2 4”不是我们发现的,F在集合中没有任何数字。
最好的设置是“1,2,3”,每个gruop在集合中都有一个数字,并且集合的大小是最佳的。它只有三个数字。这就是我们想要的。如果有很多最佳套装,找到任何一套都可以。感谢。
答案 0 :(得分:4)
通过从NP-hard vertex cover problem减少来解决这个问题是NP难的(给定一个图,你能找到一组k个节点,使得图中的每个顶点都与某个选定的节点相邻?)
减少如下。按照您喜欢的任何顺序对图1,2,3,...,n中的所有节点编号。然后,对于图中的每个边,构造仅包含两个数字的集合 - 边缘的端点。如果原始图形中存在k节点顶点覆盖,则可以选择一组k个数字(即顶点覆盖中的节点),以便从每个集合中选择一个数字。这可以用多项式时间计算。
要了解缩减的工作原理,请注意,如果有一组大小为k,则可以选择构造中的每个集合至少拾取一个元素,然后对应于这些数字的顶点形成k元素顶点覆盖在原始图表中。
这种减少可以在多项式时间内完成,因此我们可以将NP-硬顶点覆盖问题的多项式时间减少到您的问题。因此,这个问题是NP难的。因此,除非P = NP,否则没有针对此问题的多项式时间算法。
希望这有帮助!
答案 1 :(得分:4)
这相当于set cover problem。在这种情况下,您的每个集A,B,...,F都是集合覆盖问题的元素,并且数字1,2,...,13中的每一个都是集合。例如,在此映射中,1变为{A,B},而11变为集合{E}。
设置封面是NP-hard。链接的维基百科页面上的整数线性编程公式可能与您获得的确切解决方案一样好;对于大问题,贪婪算法有一个不错的近似值。