【问题标题】:Subset sum with special conditions具有特殊条件的子集和
【发布时间】:2012-09-28 09:50:21
【问题描述】:

(在您回复另一个 SO 问题的链接或将其作为副本关闭之前,请仔细阅读该问题。这与此问题的标准变体不同,我已经搜索了很长时间,所以我很漂亮确定这里没有这样的问题)

我需要找出可能的最小 S 是否是某个 X[i] 的子集的总和,即 >= T (某个目标值,小于全集的总和)。

该集合不是很大(大约 40 个元素),但对于指数回溯解决方案来说仍然太大。

数字和总和很大(大约 10^15),所以动态编程不起作用(可能的状态数量很大,所以记忆表很快就会耗尽内存) .

出于同样的原因,Pisinger 的线性时间算法不起作用(它是 O(nr),其中 r 是总和的上限,在这种情况下太大了)。

在这种金额大但数字少的情况下,是否有一些确定性算法可以帮助我?我不想求助于一些近似算法。

【问题讨论】:

    标签: algorithm optimization subset-sum


    【解决方案1】:

    鉴于上述条件,我相信使用branch & bound 的回溯解决方案是您获得确切解决方案的最佳机会。

    这个想法是检查所有子集,但您可以在算法运行期间为一些可能的子集修剪计算树。

    例如,假设您正在寻找S = 10^8,并且您已经找到了sol=10^8 + 10^7 的解决方案,现在,您正在检查作为某些X 超集的所有子集,并且您发现sum(X) = 10^9 .无需继续检查包含 X 的任何子集,您可以直接跳过它们 - 它们不会让您达到最佳状态。

    我也会尝试并行化解决方案,分支和绑定通常很容易并行化,只需要偶尔同步一次新的最佳解决方案。

    【讨论】:

      【解决方案2】:

      正如你所说,这个集合不是很大(大约 40 个)。我认为经典的复杂指数时间算法O(2^(n/2) n) 将满足您的需求http://en.wikipedia.org/wiki/Subset_sum_problem#Exponential_time_algorithm

      我可以在这里简要介绍一下这种方法。将集合拆分为两个大小相等的集合,例如 A 和 B。并为它们枚举子集总和以生成两组大小 2^(n/2),例如 PA 和 PB。然后可以对 PA 和 PB 进行排序,并使用二分查找及时找到超过T 的总和O(2^(n/2) n)

      【讨论】:

        猜你喜欢
        • 2018-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-23
        • 2010-12-02
        • 2011-08-04
        相关资源
        最近更新 更多