【发布时间】:2016-01-02 06:32:39
【问题描述】:
给定一组 2n 个整数,是否有可能找到一个分为 n 个整数的两个子集的分区,每个子集的和为正。
我的想法:我们表示集合 v[1], ..., v[2n] 的值。 令 S[j, k, s1, s2] = 1 如果存在将集合的前 j 个整数划分为 k 的两个子集的分区em> 和 j-k 整数,使得第一个子集总和为 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 个元素添加到“第一个”子集或“第二个”子集。
如果存在 s1_0>0 和 s2_0>0 使得 S[2n, n, s1_0, s2_0]=1,则问题的答案是肯定的。
你怎么看?有没有更好的方法(就时间/空间复杂度而言)?我从一开始就假设这是一个动态规划问题,还有其他方法吗?
【问题讨论】:
-
任何具有负和的序列都不能分成两个具有正和(任意长度)的序列。如果限制为具有正和的序列,则不能将序列 [2, -1] 拆分为长度为 1 的两个子序列,从而使它们的和都为正。
-
嗯,是的,你提到的是具体案例。
-
子序列需要是连续的,或者它们是大小为 n 的分区?
-
你能发布一个重要的例子吗?
-
如果它们是连续的,我们将只有一个分区。记住序列的长度。
标签: algorithm dynamic-programming