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

Algorithm 将一组2n个整数划分为两个n个整数的子集,其和为正,algorithm,dynamic-programming,Algorithm,Dynamic Programming,给定一组2n个整数,是否可以将一个分区划分为两个n个整数的子集,每个子集的和为正 我的想法是:我们表示集合v[1],…,v[2n]的值。 设S[j,k,s1,s2]=1,如果集合的前j个整数分别划分为k和j-k个整数的两个子集,使得第一个子集和为s1,第二个子集和为s2。(s1和s2当然可以是负数) 我们有以下关系:当S[j,k-1,s1-v[j+1],s2]=1或S[j,k,s1,s2-v[j+1]时,S[j+1,k,s1,s2]=1。原因是您必须将*j+1“元素添加到“第一”子集或“第二”子

给定一组2n个整数,是否可以将一个分区划分为两个n个整数的子集,每个子集的和为正

我的想法是:我们表示集合v[1],…,v[2n]的值。 设S[j,k,s1,s2]=1,如果集合的前j个整数分别划分为k和j-k个整数的两个子集,使得第一个子集和为s1,第二个子集和为s2。(s1和s2当然可以是负数)

我们有以下关系:当S[j,k-1,s1-v[j+1],s2]=1或S[j,k,s1,s2-v[j+1]时,S[j+1,k,s1,s2]=1。原因是您必须将*j+1“元素添加到“第一”子集或“第二”子集

如果存在s1_0>0和s2_0>0,使得S[2n,n,s1_0,s2_0]=1,则问题的答案是肯定的


你认为呢?有没有更好的方法(在时间/空间复杂性方面)?我从一开始就认为这是一个动态规划问题,还有其他方法吗?

不是动态规划,而是一个想法

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
设A和B为两个空集
第五类
对于[0,2,…,2n]中的i
//注意v[i]=0,和(B)>=0
其思想是尽可能均匀地分配数字,并限制负数造成的损害,同时保持集合的基数相同

  • 当两个集合的和都为负数时,分配的数字应使它们的和尽可能小地减少
  • 当正好有一个集合具有正和时,将为具有负和的集合分配最大的数字
  • 当两个集合都有正和时,任何赋值都可以

任何具有负和的序列都不能拆分为两个具有正和(任意长度)的序列。如果限制为具有正和的序列,则序列[2,-1]不能拆分为两个长度为1的子序列,这样两个子序列都有正和。当然,你提到的是一些特定的情况。子序列必须是连续的,或者它们是大小为n的分区。你能举一个非平凡的例子吗?如果它们是连续的,我们只有一个分区。记住序列的长度。我会尝试从较大的绝对值到较小的绝对值。