P1157 组合的输出

题目传送门

题目描述

题目描述

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

现要求你输出所有组合。

例如n=5,r=3,所有组合为:

12 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

输入格式

一行两个自然数\(n,r(1<n<21,0 \le r \le n)\)

输出格式

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

**注意哦!输出时,每个数字需要33个场宽,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

dfs算法求解

分析

代码

#include<iostream>
#include<cstdio>
using namespace std;

int n, r; 
int res[100];

// 搜索第k个数 
void dfs(int k)
{
	if(k > r)
	{
		for(int i= 1; i <= r; i++) printf("%3d", res[i]);
		puts("");
		return;
	}
	
    
    // 从上一个数紧接着往后搜
	for(int i = res[k-1]+1; i <= n; i++)
	{
		res[k] = i;
		dfs(k+1);
	}
}

int main()
{
	scanf("%d%d", &n, &r);
	dfs(1);
	return 0;
}

时间复杂度

参考文章

https://www.luogu.com.cn/problem/solution/P1157

posted @ 2022-02-27 20:03  VanHope  阅读(63)  评论(0编辑  收藏  举报