子集,其总和是特定阈值的最小总和

时间:2010-02-25 22:15:53

标签: subset-sum

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

3 个答案:

答案 0 :(得分:4)

您的问题是Subset Sum Problem的变体,并且是NP完整的。

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

如果性能不是问题,您也可以枚举所有可能的集合。如果性能是一个问题,您可以尝试在维基百科页面上查看如何优化此类算法的想法,例如使用动态编程。该页面上的算法实际上应该像子集和问题一样有效地解决您的问题。

答案 1 :(得分:0)

“最小总和”:这是一个经典的“最大总和”问题,在此处有详细描述:http://wordaligned.org/articles/the-maximum-subsequence-problem

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

答案 2 :(得分:0)

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

Pisinger发现了一种线性时间动态编程算法,可以在阈值下找到最大值,这与问题的倒数相反。因此,如果从整数的总和中减去所需的阈值,则可以使用Pisinger算法的新阈值来查找不在所需集合中的所有数字。

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

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

代码: Fast solution to Subset sum algorithm by Pisinger