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