【问题标题】:Partition a set of 2n integers into two subsets of n integers whose sum is positive将一组 2n 个整数划分为两个总和为正的 n 个整数的子集
【发布时间】: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。 (s1s2 当然可以是负数)

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

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

你怎么看?有没有更好的方法(就时间/空间复杂度而言)?我从一开始就假设这是一个动态规划问题,还有其他方法吗?

【问题讨论】:

  • 任何具有负和的序列都不能分成两个具有正和(任意长度)的序列。如果限制为具有正和的序列,则不能将序列 [2, -1] 拆分为长度为 1 的两个子序列,从而使它们的和都为正。
  • 嗯,是的,你提到的是具体案例。
  • 子序列需要是连续的,或者它们是大小为 n 的分区?
  • 你能发布一个重要的例子吗?
  • 如果它们是连续的,我们将只有一个分区。记住序列的长度。

标签: algorithm dynamic-programming


【解决方案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

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

  • 当两个集合的总和为负时,分配的数字使得它们的总和尽可能小
  • 当恰好一个集合具有正和时,最大数字将分配给具有负和的集合
  • 当两个集合的和为正时,任何分配都可以

【讨论】:

  • 我会尝试从较大的绝对值到较小的绝对值。
猜你喜欢
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多