集合 {1, 2, 3, .. 的分区.N}.
Partition of set {1, 2, 3, ... N}
给定子集 {1, 2, 3, ....N}. 我必须找到从 1 到 N 的所有整数集合可以分成两个总和相等的子集的方法的数量。
我脑子里什么都没有。我想尝试"暴力搜索",但它可以设置时间限制。有没有快速算法?
多项式时间内可计算为 x^(n(n+1)/4) 的系数,对于 k 从 1 到 n,在 (1 + x^k) 的乘积中。有几种方法可以评估产品;将术语一一相乘就足够了。
我认为问题是NP困难的,所以我认为你不能在多项式时间内找到最佳解决方案(除非P = NP)。
编辑:是的,正如我的继任者指出的那样,我谈论的是集合双分区的更普遍的问题,应该有一种简单的方法来找出每个可能的集合对。
是否有纯粹的数学方法可以解决这个问题,或者有什么超级花哨的东西......但我的第一直觉是,既然你知道这些数字是连续的,那么在列表中的任何时候,你应该能够知道到那个点的总和是多少。因此,如果您选择在很多不应该可能的排列上暴力破解它,您应该能够做出一些明智的选择,以消除您需要检查的许多情况。
分解问题...
假设您想查找仅 2 个总和为一个值的数字的子集。显然,您可以在线性时间内执行此操作。例如,如果集合是 { 1, 2, 4, 7, 9 } 并且值是 11,那么从一端 (1) 开始,您从另一端向后走并到达 9(不匹配)。因此,现在您将底部数字索引递增 1 (=2),它与 9 匹配。再次递增 (=4)。等等。这样做,你只需要让一个通过值列表。
当然,这只能解决问题的 2 个成员子集部分。
因此,现在对 3 成员子集重复该过程。您可以使用完全相同的技术,只是使用 3 个游标而不是 2 个游标。等等...
我不知道游标数量的复杂性,它可能是log N,但无论如何它都会比蛮力搜索快得多。如果是对数 N,则总复杂度为 N log N,其中 N 是集合中元素的数量。
- 处理多个异常集合的C++方法
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 如何将ampl中的集合表示为c++中的向量
- 检查值是否在集合p1和p2中,但不在p3中
- 带过滤器的现代迭代c++集合
- 如何将结构插入到集合中并打印集合的成员
- 集合上的输出迭代器:assign和increment迭代器
- 如何将函数集合传递给客户端类,以便将它们当作客户端类本身的成员使用
- 实现一个在集合上迭代的模板函数
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 尝试使用集合函数时出现分段错误
- 互斥指针的集合
- c++找不到具有相同哈希的无序集合元素
- python集合的C++等价物是什么.计数器
- 如何在C++中递归地按相反顺序打印集合
- Python 集合.计数器,如何避免重复查找
- 如何写向量的无序向量集,即unordered_set<向量<向量<int>>集合?
- 从具有自定义排序的向量创建集合
- 如何查找集合的所有分区 (C++)
- 集合 {1, 2, 3, .. 的分区.N}.