问题
从包含n个元素的集合s=[x0,x1,x2,…,xn−1]中任意取m个元素(m≤n)组成组合,求所有组合。集合s中任意两元素互不相同。
解法
设置集合c=[c0,c1,c2,…,cm−1]表示集合s的选择,ci=1表示选择数字xi,ci=0表示不选择数字xi。比如集合s=[x0,x1,x2,…,xn−1]中取出组合
[x0,x1,x2] 等价于集合
c=[10,11,12,03,…,0n−1] 即元素[c0,c1,c2]为1,元素[c3,…,cn−1]为0。
可以看出,包含n个元素的集合s=[x0,x1,x2,…,xn−1]中取出m个元素的所有组合,可以转化为求有i个1,m−i个0的集合c的唯一全排列,其中0≤i≤m。
(1) 从集合s中取出0个元素作为组合,即c中有0个1,m个0,唯一全排列有C0m=1个
只要求出所有唯一全排列,即可反向求出对应的组合。
StackOverflow - algorithm-to-return-all-combinations-of-k-elements-from-n
二项式系数
Chase’s Twiddle - Algorithm 382: Combinations of M out of N Objects:
Buckles - Algorithm 515: Generation of a Vector from the Lexicographical Index:
源码
测试