0:需求(这里分为两个:逆字典序和字典序)
1:准备知识描述 找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。 输入 输入n、r。 输出 按特定顺序输出所有组合。 特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。 样例输入 5 3 样例输出 543 542 541 532 531 521 432 431 421 321
/* 自然数的组合数回溯算法combine(n,r),这里是按照字典序来讲解的 参数定义: int n: 被求组合数的自然数 int r: 要求组合数的自然数个数 编程思想:(此分析以调用combine(5,3)为例) 采用回溯法处理组合数,将找到的组合以从小到大顺序存入number[0], number[1],...,number[n-1]中,组合的元素满足如下关系式: (1) number[i+1] > number[i]; 后一位比前一位大 (2) number[i]-i <= n-r+1; 对于第二个条件这样理解number的每一位都有最大值,这个最大值肯定和n和r还和本位下标i有关,至于加1是调整用的比如combine(5,3)按照字典序来,i=0第一位的最大值肯定是3吧,i=1第二位最大值肯