CMN题目描述

1CMN题目描述

排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<n),我们可以简单地将n个元素理解为自然数12n,从中任取r个数。

现要求你不用递归的方法输出所有组合。

例如n5r3,所有组合为:

l 2 3  l 2 4   1 2 5   l 3 4   l 3 5   1 4 5   2 3 4   2 3 5   24 5   3 4 5

输入输出格式

输入格式:

一行两个自然数nr(1<n<211<r<n)

输出格式:

所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。

**注意哦!输出时,每个数字需要3个场宽,pascal可以这样:

write(ans:3);

输入输出样例

输入样例#1

5 3

输出样例#1

  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 <bits/stdc++.h>//万能头文件

using namespace std;

int total=0;

int a[50]; //a数组存每一次选的数

bool b[50];

int n,r;

void print(){ //打印函数

   for(int i=1; i<=r; i++)

   cout<<setw(3)<<a[i];//定义场宽为3,直接输出只能得10分

   cout<<endl;

}

void search(int t)//搜索函数

{

   int i;

   if(t>r) { //如果搜完了就输出a数组

       print();

       return;

    }

   for(int i=1; i<=n; i++){ //枚举每一个数

       if(!b[i]&&i>a[t-1]||t==1)//当i木有被使用过且i必须大于前个数但除1之外

{

           a[t]=i; //将i存入a数组

           b[i]=true;//标记i已被使用

           search(t+1);//继续搜索

           a[t]=0;//回溯一步

           b[i]=false;

       }

    }

}

int main(){

   cin>>n>>r;//输入

  search(1);

  return 0;

}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值