algorithm - 子集和的变体

标签 algorithm set subset-sum

给定3正整数 n, k, and sum , 准确找到 k不同元素的数量 a_i , 其中
a_i \in S, 1 <= i <= k, and a_i \neq a_j for i \neq j
S是集合
S = {1, 2, 3, ..., n}
这样
\sum_{i=1}^{k}{a_i} = sum
由于指数复杂性,我不想使用蛮力(检查所有可能的组合)来解决问题。有人可以给我一个解决这个问题的另一种方法的提示吗?另外,我们如何利用集合 S 的事实排序了吗? 是否可能有 O(k) 的复杂性在这个问题上?

最佳答案

关于如何利用 1..n 设置属性的想法:

a开始的自然行的k个连续成员之和为

sum = k*(2*a + (k-1))/2

为了获得关于所需s的子序列的总和,我们可以解决

a >= s/k - k/2 + 1/2
or 
a <= s/k - k/2 + 1/2

比较 ssum 值并进行更正。

例如,s=173n=40k=5,我们可以找到

a <= 173/5 - 5/2 + 1/2 = 32.6

对于起始编号 32,我们有序列 32,33,34,35,36sum = 170,对于 3 的校正,我们只需将 36 更改为 39 ,或 34,35,3635,​​36,37 等等。

似乎使用这种方法我们得到了 O(1) 的复杂度(当然,可能存在一些我确实错过的微妙之处)

关于algorithm - 子集和的变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39554616/

相关文章:

c - C 中分母的增量

algorithm - 哪些算法)可以解决这个约束规划问题?

c++ - 为什么我无法让迭代器使用 find 来设置元素?

java - Java 中的 Set 不允许重复,但它接受具有相同参数的 StringBuffer 对象。为什么?

java - 与在 Java 中表示集合的集合混淆?

c++ - 将数组分成 k 个连续的分区,使得最大分区的总和最小

C - 或两个位图的最快方法

python - 生成密码列表时出现内存错误

algorithm - 来自(可能非常大的)列表的非空分组的不同总和数

algorithm - VBA 中的递归、多个基本情况