集合{1,2,3,... N}的分区

时间:2015-03-10 18:14:51

标签: c++ algorithm

给出子集{1,2,3,...... N}。我必须找到一组从1到N的所有整数的方法可以被分成两个具有相等和的子集。

没有什么事发生在我脑海里。我想尝试“暴力搜索”,但它可以限时。有没有快速算法?

4 个答案:

答案 0 :(得分:4)

对于从1到n的k,在(1 + x ^ k)的乘积中,在多项式时间内可计算为x ^(n(n + 1)/ 4)的系数。有几种方法可以评估产品;将这些术语逐一相乘就足够了。

答案 1 :(得分:1)

我认为问题是NP难的,所以我认为你不能在多项式时间内找到最优解(除非P = NP)。

修改 是的,正如我的继任者所指出的那样,我正在谈论设定二分的更普遍的问题,应该有一种简单的方法来找出每一个可能的集合对。

答案 2 :(得分:0)

我不知道是否有纯粹的数学方法可以解决这个问题,或者说是超级想象的东西...但我的第一个直觉是,因为你知道数字是连续的,所以在列表中的任何一点你应该能够分辨到那一点的总和是什么。因此,如果你选择在很多不可能的排列上强制选择它,你应该能够做出一些聪明的选择,以消除你需要检查的很多情况。

答案 3 :(得分:0)

要解决问题...

想象一下,您想要找到只有2个数字的子集,它们总和为一个值。显然你可以在线性时间内做到这一点。例如,如果集合为{1,2,4,7,9}且值为11,则从一端(1)开始,从另一端向后移动并达到9(不匹配)。所以,现在你将底部数字索引增加一(= 2),它匹配9.再次增加(= 4)。等等。这样做你只需要通过一个值列表。

当然,这只能解决问题的2个成员子集部分。

所以,现在重复3个成员子集的过程。你可以使用完全相同的技术,除了使用3个游标而不是2个。依此类推......

我不知道复杂性是游标数量的函数,它可能是log N,但无论如何它将比暴力搜索更快。如果它是log N,则总复杂度为N log N,其中N是集合中元素的数量。