【问题标题】:Subset whose sum is the smallest sum over a specific threshold总和是特定阈值上的最小总和的子集
【发布时间】:2010-02-25 22:15:52
【问题描述】:

给定一个正整数的集合,我想要那些整数的子集,其总和是超过阈值的最小总和。

【问题讨论】:

  • 子集不必是连续的

标签: subset-sum


【解决方案1】:

您的问题是 Subset Sum Problem 的变体,是 NP 完全的。

要了解原因,让我们假设您有一个算法可以解决您的问题,并且它会产生一个带有 sum 的答案。然后你已经证明不存在等于 s - 1 的整数的子集,即你有一个子集和问题的解决方案。

如果性能不是问题,您不妨列举所有可能的集合。如果性能是一个问题,您可以尝试在 Wikipedia 页面上查找有关如何优化此类算法的想法,例如使用动态编程。该页面上的算法实际上应该几乎与子集和问题一样有效地解决您的问题。

【讨论】:

  • 只有当子集不连续时才为真(即您可以将第 3、12 和 15 号项目选择到子集中)
【解决方案2】:

“最小和”:有一个经典的“最大和”问题,在这里很好地描述:http://wordaligned.org/articles/the-maximum-subsequence-problem

这只是一个“超过阈值”条件的微小变化——只是循环中的一个额外的 IF 语句。

【讨论】:

  • 我不是在寻找一个连续的子序列
【解决方案3】:

我遇到了同样的问题!如果所有 N 个整数都是正数并且以常数 C 为界,则有一个解,时间和空间要求为 O(NC)。

Pisinger 发现了一种线性时间动态规划算法,可以找到阈值下的最大值,这就像您的问题的逆运算。所以,如果你从整数的总和中减去你想要的阈值,你可以使用这个新的阈值和 Pisinger 的算法来找到所有不在想要的集合中的数字。

根据所讨论整数的大小,这可能可行,也可能不可行。

皮辛格的论文: http://www.diku.dk/~pisinger/95-6.ps

代码: Fast solution to Subset sum algorithm by Pisinger

【讨论】:

    猜你喜欢
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2016-12-29
    • 2013-08-20
    相关资源
    最近更新 更多