线性算法找到最小子集和超过一个阈值

Linear algorithm to find minimum subset sum over a threshold

本文关键字:阈值 一个 算法 子集 线性      更新时间:2023-10-16

我有一个N个正整数的集合,每个正整数都以一个(相对较小的)常数c为界,我想找到这些数字的一个子集,其最小和大于(或等于)值k

所涉及的数字不是很大(<100),但即使在最坏的情况下,我也需要良好的性能。我想也许我可以把皮辛格的动态规划算法应用到这个任务中;它在0 (NC)时间内运行,而且我恰好满足有界正数的要求。

[Edit]:数字没有排序,可能有重复。

然而,我不太了解这个算法,不能自己做这个。事实上,我甚至不确定它所基于的假设是否仍然成立……

-是否有可能使这个算法适应我的需要?

-或者我可以使用另一种线性算法,同样有效?

-谁能提供伪代码或详细解释?

谢谢。

链接到我正在研究的子集和代码:用Pisinger

快速求解子集和算法

(如果这是糟糕的措辞/格式/等道歉。我仍然是新的StackOverflow…)

Pisinger算法给出了小于或等于背包容量的最大和。要解决这个问题,可以使用Pisinger找出哪些不是应该放在子集中。正式地,设项目为w_1,…, w_n,最小值为k,给出w_1,…, w_n和w_1 +…+ w_n - K到Pisinger,然后取所有Pisinger没有的项

一个解决方案是:

T = {0}
for x in V
   for t in T
       T.insert(x+t)
for i in K to max(T)
   if (T.contains(i))
       return i
fail

这给出了子集的大小,但您可以调整输出成员。

T的最大大小为O(N)(因为有C界),所以运行时间为O(N^2),空间为O(N)。您可以使用长度为NC的位数组作为t的后备存储