最大子集和

时间:2017-05-26 15:10:28

标签: algorithm subset-sum

我正在尝试解决最大子集和问题的略有不同的变化。我希望找到能够为数组提供最大总和的元素,而不是连续的元素。例如,给定以下数组:

{1,-3,-5,3,2,-7,1}输出应为7(总和最大的子阵列为{1,3,2,1})。

这里是我用来计算最大总和的代码:

onclick="onClick"

当我在同一个数组中一起使用正数和负数时,它可以正常工作。但是,当我只使用负数时问题就开始了 - 输出总是为0.我想这是因为我在调用函数时第一次发送0作为总和。有人可以告诉我应该如何更改我的功能,以便它也只能使用负数。

2 个答案:

答案 0 :(得分:3)

您的解决方案不必要地复杂且效率低下(时间复杂度O(2^n))。

这是一种简单而有效的(O(N)时间,O(1)额外空间)方式:

  1. 如果列表中至少有一个非负数,则返回所有正数的总和。

  2. 否则返回列表中的最大元素。

  3. 以下是一些代码:

    def get_max_non_empty_subset_sum(xs):
         max_elem = max(xs)
         if max_elem < 0:
              return max_elem
         return sum(x for x in xs if x > 0)
    

答案 1 :(得分:0)

特殊情况是所有元素都是否定的。在这种情况下,找到最小的负数。这将是你的答案。这可以在O(N)时间复杂度下完成。

PSEUDO CODE

ALLNEG=true
LEAST_NEG= -INFINITY
for number in list:
    if number>=0
        ALLNEG=false
        break
    else if number>LEAST_NEG
        LEAST_NEG=number
if ALLNEG==true
    answer=LEAST_NEG
else
    ...