组合的输出

【问题描述】
    排列与组合是常用的数学方法,其中组合就是从 n 个元素中抽出 r 个元素 ( 不分顺序且 r< n) ,我们可以简单地将 n 个元素理解为自然数 1 2 n ,从中任取 r 个数。
    现要求你用递归的方法输出所有组合。
    例如 n 5 r 3 ,所有组合为:
    l 2 3   l 2 4   1 2 5   l 3 4   l 3 5   1 4 5   2 3 4   2 3 5   2 4 5   3 4 5
【输入】
    一行两个自然数 n r(1<n<21 1< r< n)
【输出】
   所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三 个字符的位置,所有的组合也按字典顺序。
【样例】
compages.in       compages.out
5   3                                           1 2 3
       1 2 4
       1 2 5
       1 3 4
       1 3 5
       1 4 5
       2 3 4
       2 3 5
       2 4 5
       3 4 5
 #include<iostream>
 #include<cstdio>
 #include<cstring>
 #include<string>
 #include<algorithm>
 #include<cmath>
 using namespace std; 
 int n,c,a[1000]={1};bool b[1000];
 void dfs(int);
 void print();
 int main()
 {
     cin>>n>>c;
     dfs(1);
     return 0;
 }
 void dfs(int q)
 {
     int i;
     for(i=a[q-1];i<=n;i++)
     {
         if(!b[i])
         {
             a[q]=i;
             b[i]=1;
             if(q<c)dfs(q+1);
             else print();
             b[i]=0;
        }
    }
 }
 void print()
 {
     for(int i=1;i<=c;i++)
     {
         cout<<a[i]<<" ";
     }
     cout<<endl;
 }

 

转载于:https://www.cnblogs.com/sssy/p/6611317.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值