假设我有一组有限的大小为n的数值。
问题:是否有一种有效的算法来枚举该组的k组合,以便组合I在组合J之前,如果I中元素的总和小于或等于J?
中的元素显然,可以简单地枚举组合并根据它们的总和对它们进行排序。但是,如果集合很大,那么所有组合的粗略枚举,更不用说排序,将是不可行的。如果我只对获得第一个m<<<选择(n,k)组合按总和排序,是否有可能在宇宙热死之前获得它们?
答案 0 :(得分:5)
没有用这种方式枚举集合的多项式算法(除非P=NP)。
如果有这样的算法(让它成为A),那么我们可以多项式求解subset sum problem:
请注意,步骤1以多项式(假设)运行,第2步在O(log(2^n)) = O(n)
中运行。
结论:由于子集和问题是NP-Complete,有效地解决这个问题将证明P = NP - 因此没有已知的多项式解决方案。
修改:即使问题是NP-Hard,通过选择最小的m
,可以在O(n+2^m)
上获取“最小”m
子集元素,从这些m
元素生成所有子集 - 并选择那些元素的最小m
。因此,对于相当小的m
值 - 计算它可能是可行的。