【问题标题】:Algorithm to check for a linear sum to zero检查线性和为零的算法
【发布时间】:2012-07-29 06:25:35
【问题描述】:

给定一个N非负整数列表,提出一个算法来检查列表中X数字的总和是否等于剩余的N-X

换句话说,Subset sum problem 的一个更简单的情况涉及整个集合。

尝试的解决方案

按降序对列表的元素进行排序。将变量SUM 初始化为第一个元素。删除第一个元素(最大,a(1))。让a(n) 表示当前列表中的n-th 元素。

虽然列表有多个元素,

  1. 使SUM 等于SUM + a(1)SUM - a(1),以最接近a(2) 为准。 (最接近的意思是|a(2) - SUM_POSSIBLE| 是最小值)。

  2. 删除a(1)

如果SUM 等于-a(1)a(1),则存在线性和。

问题

我似乎无法解决上述算法,如果它是正确的,我想要一个证明。 如果它是错误的(更有可能),有没有办法在线性时间内完成?

PS:如果我做错了什么,请原谅:S

【问题讨论】:

    标签: algorithm subset-sum


    【解决方案1】:

    请注意,您希望 x 数字的总和等于其他 N-x 数字的总和。
    您可以通过说您想查看是否有一个总和为 S/2 的子集来简化这一点,其中 S 是整个集合的总和。

    因此,您可以计算一次迭代所需的总和 (O(n))。

    然后只需使用像 Knapsack 这样的已知算法来找到满足您总和的子集。

    另一个更“数学”的解释:Dynamic Programming – 3 : Subset Sum

    编辑:

    作为对您其他问题的回答,您的算法是错误的。考虑一下这个数字列表:

    {3,3,4,4}

    总和是 14,因此您要寻找总和为 7 的子集。显然它将是 3+4。

    在检查 2 个 3 后,您的算法将返回 false

    【讨论】:

    • 我想你错过了排序部分。 {3,3,4,4} -> {4,4,3,3},这将正确选择 4-4=0 而不是 4+4=7 作为 |0-3|=3 < |7-3|=4。现在可以在列表的其余部分调用所提出的算法。我理解您答案的另一部分,但我认为我提出的算法会更快(如果证明是正确的)。感谢闪电般的快速响应!
    • 我刚刚看到Partition problem,一旦我们发现S 是偶数,这正是我们想要做的。作为奖励,我的算法也打破了贪婪的反例。最后感谢 Yochai :D
    猜你喜欢
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2017-08-07
    • 2011-09-17
    • 2011-07-20
    • 1970-01-01
    相关资源
    最近更新 更多