从n个数中挑m个数--排列组合(递归)

链接:https://ac.nowcoder.com/acm/contest/998/B
来源:牛客网
 

题目描述

从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。n>0n \gt 0n>0, 0≤m≤n0 \leq m \leq n0≤m≤n, n+(n−m)≤25n+(n-m)\leq 25n+(n−m)≤25。

输入描述:

两个整数n,m。

输出描述:

 

按照从小到大的顺序输出所有方案每行1个。

首先,同一行内的数升序排列,相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如1 3 9 12排在1 3 10 11前面)。

示例1

输入

复制

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<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<cmath>
#include<string>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
ll a[30];

void dfs(ll num,ll len,ll n,ll m){
	if(len==m){//选全m个数 
			for(ll i=1;i<=m-1;i++){
				cout<<a[i]<<" ";
			}
			cout<<a[m]<<endl;
			return ; 
	}
	if(num==n){//没有选全m个数,但是数已经超过n,return; 
		return ;
	}
	for(ll i=num+1;i<=n;i++){//寻找num后面的数字 
		a[++len]=i;//选进 
		dfs(i,len,n,m);
		len--;//踢出 
	}
	return ;
}

int main(){
	ll n,m;
	cin>>n>>m;
	dfs(0,0,n,m);
return 0;
}

 

  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值