nyoj-组合数

来源:互联网 发布:js 日期控件 编辑:程序博客网 时间:2024/06/06 08:55


组合数

描述
找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
输入
输入n、r。
输出
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入
5 3
样例输出
543
542
532
541
531
431
521432421
321

思路:

         这是一道搜索题,和全排列差不多,只不过对数字的输出多加了一些要求,
首先找到结束条件,即step=m+1,该题要求降序输出,所以可以从n开始搜索,即存入数组,
该题的判断条件即:该数未用过,且该数比前面一个数小。 


代码:


       

#include<stdio.h>int a[10],book[10],n,m;void dfs(int step){int i;if(step==m+1)//结束条件 {for(i=1;i<=m;i++){printf("%d",a[i]);}printf("\n");return;}for(i=n;i>0;i--){if(book[i]==0&&(a[step-1]>i))//未用过且前面一个数大于i {a[step]=i;//把数存进数组里 book[i]=1;//标记已经用过该数 dfs(step+1);//搜索下一个 book[i]=0;//取消标记 }}return;}int main(){scanf("%d%d",&n,&m);a[0]=999999;dfs(1);return 0;}

0 0