【发布时间】:2010-02-25 22:15:52
【问题描述】:
给定一个正整数的集合,我想要那些整数的子集,其总和是超过阈值的最小总和。
【问题讨论】:
-
子集不必是连续的
标签: subset-sum
给定一个正整数的集合,我想要那些整数的子集,其总和是超过阈值的最小总和。
【问题讨论】:
标签: subset-sum
您的问题是 Subset Sum Problem 的变体,是 NP 完全的。
要了解原因,让我们假设您有一个算法可以解决您的问题,并且它会产生一个带有 sum 的答案。然后你已经证明不存在等于 s - 1 的整数的子集,即你有一个子集和问题的解决方案。
如果性能不是问题,您不妨列举所有可能的集合。如果性能是一个问题,您可以尝试在 Wikipedia 页面上查找有关如何优化此类算法的想法,例如使用动态编程。该页面上的算法实际上应该几乎与子集和问题一样有效地解决您的问题。
【讨论】:
“最小和”:有一个经典的“最大和”问题,在这里很好地描述:http://wordaligned.org/articles/the-maximum-subsequence-problem
这只是一个“超过阈值”条件的微小变化——只是循环中的一个额外的 IF 语句。
【讨论】:
我遇到了同样的问题!如果所有 N 个整数都是正数并且以常数 C 为界,则有一个解,时间和空间要求为 O(NC)。
Pisinger 发现了一种线性时间动态规划算法,可以找到阈值下的最大值,这就像您的问题的逆运算。所以,如果你从整数的总和中减去你想要的阈值,你可以使用这个新的阈值和 Pisinger 的算法来找到所有不在想要的集合中的数字。
根据所讨论整数的大小,这可能可行,也可能不可行。
【讨论】: