找到至少大小为 k 到 n 的所有组合

Posted

技术标签:

【中文标题】找到至少大小为 k 到 n 的所有组合【英文标题】:Find all combinations of at least size k to n 【发布时间】:2020-10-29 20:44:51 【问题描述】:

我正在努力找出这个问题的公式:

给定一组n 数字和一个限制k,计算所有至少大小为k 的非重复组合。

例如:A=[1,2,3] k = 2 output = 4 // [1,2],[1,3],[1,2,3],[2,3]

数组可以包含重复的数字。

例如:A=[1,1,2] k = 2 output = 3 // [1,1],[1,2],[1,1,2] 但不接受[1,2],[2,1], etc.

我可以使用backtracking 解决它,但是 TLE。我一直在尝试从诸如查找n 的所有组合或查找k 的所有大小组合之类的问题中找到一个公式,但没有成功。

到目前为止,我已经弄清楚了这张表:

row = k
col = n
   1 2 3 4 5
  ---------
1| 1 2 3 4 5
2|   1 3 6 10
3|     1 4 10
4|       1 5 

而公式(不是我想要的)是:

combinations of size i with j numbers:
dp[i][j] = dp[i][j-1] + dp[i-1][j-1]
count(n,k) combinations of size k with n numbers
count(2,1) = 2
count(4,3) = count(3,3) + count(3,2) = 1 + 3 = 4
count(5,2) = count(4,2) + count(4,1) = 6 + 4 = 10
and so on

更新

根据 Oliver Dain 的回答,如果您有兴趣,这里是代码

def count_combinations(n, k):
    count = 0
    for i in range(k, n + 1):
        count += math.factorial(n)/(math.factorial(i)*math.factorial(n - i))
    return int(count)

【问题讨论】:

为什么[2,3] 没有包含在A=[1,2,3] 的答案中? 我刚刚解决了这个问题。感谢您指出这一点。 您需要计数还是所有不同的序列? 数组可以包含重复的条目。不,我不能那样做。我会更新问题。 我需要计数。 【参考方案1】:

首先弄清楚数组中有多少个 unique 值(例如,在大多数编程语言中,您可以将它们放入 set 中,然后找到该集合的大小)。假设有 u 唯一值。那么你的答案是 u choose p 的总和,对于在 ku 之间的所有 p 值(包括两端)。

【讨论】:

啊!谢谢你的链接。这超级有用!我想通了。 很高兴有帮助。顺便说一句,请注意阶乘变大的速度非常快,所以要小心整数溢出。【参考方案2】:

使用 set 删除重复项

查看 set 如何删除重复项Remove duplicate tuples from a list if they are exactly the same including order of items

【讨论】:

计数中的大小是什么意思?我不明白问题的那一部分

以上是关于找到至少大小为 k 到 n 的所有组合的主要内容,如果未能解决你的问题,请参考以下文章

k 大小 p 的不同组合,无需替换

总和至少为 K 的最小数字集

AtCoderAGC005 F - Many Easy Problems 排列组合+NTT

组合计数训练

51Nod 1677 treecnt 树形dp+组合数学+逆元

在N个元素的数组中获取K个元素的所有组合问题