给定一组 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> 你怎么看?有没有更好的方法(在时间/空间复杂性方面)?我从一开始就假设这是一个动态编程问题,还有其他方法吗?
答案 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
我们的想法是尽可能均匀地分配数字并限制负数造成的损害,同时保持集合的基数相同