【go/方法记录】数学中的组合问题
编程语言
2023-08-06 13:01:34
阅读次数: 0
问题描述
- 主要解决数学中排列组合中的组合问题,即:
C n r = A n r r ! C_n^r=\frac{A_n^r}{r!} Cnr=r!Anr
解决
- 参见这个
- 原理
- 计算 ∑ r = 0 n C n r \sum_{r=0}^n C_n^r ∑r=0nCnr,即二项式定理,共 2 n 2^n 2n种组合,可以使用n个比特位表示。
例如 n = 3 n=3 n=3时:
000,001,010,011,100,101,110,111
- 取出其中满足:bit位1的数目为r的组合,即结果
例如 n = 3 , r = 2 n=3,r=2 n=3,r=2时:
011,101,110
- 代码
func Combinations(set []string, n int) (subsets [][]string) {
length := uint(len(set))
if n <= 0 {
return
}
if n > len(set) {
n = len(set)
}
for subsetBits := 1; subsetBits < (1 << length); subsetBits++ {
if n > 0 && bits.OnesCount(uint(subsetBits)) != n {
continue
}
var subset []string
for object := uint(0); object < length; object++ {
if (subsetBits>>object)&1 == 1 {
subset = append(subset, set[object])
}
}
subsets = append(subsets, subset)
}
return subsets
}
转载自blog.csdn.net/qq_33446100/article/details/120252545