【发布时间】: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]的答案中? -
我刚刚解决了这个问题。感谢您指出这一点。
-
您需要计数还是所有不同的序列?
-
数组可以包含重复的条目。不,我不能那样做。我会更新问题。
-
我需要计数。