用递归和动态规划:
将n个元素从左往右排好序。每次选择的m个元素的组合按如下步骤,
- 先选第一个元素,有n-m+1种选择方案
- 第一个元素的位置确定后,其余待选择的m-1个元素从已选择元素的右边选择。这是个与原问题同构的子问题,可以用递归。
- 递归的终止条件有两个,一个是n==m也就是剩余元素数量和剩余位置数量相等,只有一种组合方法;一个是m==0也就是m个元素都已经排完了。
- 用一个全局的数据结构存储动态规划的子问题状态,避免重复计算。
而根据第一个元素的位置生成的n-m+1个子问题是互斥且完备的,因此方法成立。
1 | def combination(n, m): |
带入参数计算combination(1000, 500)得到一个很大的组合数数:
1 | 2702882409454365695156146936259752754961520084465482870073928751066254287055 |