问题描述
- 主要解决数学中排列组合中的组合问题,即:
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
- 计算
∑
r
=
0
n
C
n
r
\sum_{r=0}^n C_n^r
∑r=0nCnr,即二项式定理,共
2
n
2^n
2n种组合,可以使用n个比特位表示。
- 代码
// 其他数组类型均可使用 func Combinations(set []string, n int) (subsets [][]string) { length := uint(len(set)) if n <= 0 { return } if n > len(set) { n = len(set) } // 从1遍历到2^length for subsetBits := 1; subsetBits < (1 << length); subsetBits++ { // 如果subsetBits中bit 1的数量不为n,跳过 if n > 0 && bits.OnesCount(uint(subsetBits)) != n { continue } var subset []string // 将对应bit 1的位置(index)对应的set[index]取出来 for object := uint(0); object < length; object++ { if (subsetBits>>object)&1 == 1 { subset = append(subset, set[object]) } } // 添加到返回值 subsets = append(subsets, subset) } return subsets }