找到至少大小为 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 的总和,对于在 k
和 u
之间的所有 p 值(包括两端)。
【讨论】:
啊!谢谢你的链接。这超级有用!我想通了。 很高兴有帮助。顺便说一句,请注意阶乘变大的速度非常快,所以要小心整数溢出。【参考方案2】:使用 set 删除重复项
查看 set 如何删除重复项Remove duplicate tuples from a list if they are exactly the same including order of items
【讨论】:
计数中的大小是什么意思?我不明白问题的那一部分以上是关于找到至少大小为 k 到 n 的所有组合的主要内容,如果未能解决你的问题,请参考以下文章
AtCoderAGC005 F - Many Easy Problems 排列组合+NTT