将一组2n个整数划分为n个整数的两个子集,其总和为正

时间:2016-01-02 06:32:39

标签: algorithm dynamic-programming

给定一组 2n 整数,是否可以在 n 整数的两个子集中找到一个分区,每个子集的总和为正。

我的想法:我们表示集合 v [1],...,v [2n] 的值。 如果 S [j,k,s1,s2] = 1 ,如果该集合的第一个 j 整数的分区存在于 k的两个子集中 em>和 jk 分别为整数,这样第一个子集总和到 s1 ,第二个子集总和到 s2 。 ( s1 s2 当然可以是否定的)

我们有以下关系: S [j + 1,k,s1,s2] = 1 iff S [j,k-1,s1-v [j + 1] ,s2] = 1 S [j,k,s1,s2-v [j + 1]] 。原因是你必须添加* j + 1 th"元素到"第一"子集或"秒"。

如果 s1_0&gt; 0 s2_0&gt; 0 使得S [2n,n,s1_0,s2_0] = 1,问题的答案是肯定的。< / p> 你怎么看?有没有更好的方法(在时间/空间复杂性方面)?我从一开始就假设这是一个动态编程问题,还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

不是动态编程,但仍然是一个想法。

let A and B be two empty sets

sort v
for i in [0, 2, ..., 2n)
    // note that v[i] <= v[i + 1]
    assign v[i] to the set with the largest sum
    assign v[i + 1] to the set with the smallest sum

return sum(A) >= 0 and sum(B) >= 0

我们的想法是尽可能均匀地分配数字并限制负数造成的损害,同时保持集合的基数相同

  • 当两组都有负数时,数字被分配,使得它们的总和尽可能减少
  • 当恰好一组具有正和时,将使用负和
  • 将最大数字分配给该组
  • 当两组都有正数时,任何分配都没有问题