【递归入门】组合的输出

题目描述

排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r < = n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。 
现要求你不用递归的方法输出所有组合。 
例如n = 5 ,r = 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

输入

一行两个自然数n、r ( 1 < n < 21,1 < = r < = n )。

输出

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

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

int n, r,a[30],book[30];
void dfs(int x)//参数用来表示状态
{
	if (x==r+1)
	{
		for (int i = 1; i <= r; i++)
			cout << a[i]<<" ";
		cout << "\n";
			return;
	}
	for (int i = 1; i <= n;i++)
	{
		if (book[i]==0&&i>a[x-1])//   i>a[x-1]   是升序
		{
			a[x] = i;
			book[i] = 1;// 标记;
			dfs(x + 1);
			book[i] = 0;//回溯
		}
	}
	return;
}
int main()
{
	cin >> n>>r;
	dfs(1);
	return 0;
}

  

原文地址:https://www.cnblogs.com/52dxer/p/10371575.html

时间: 2024-11-05 16:39:21

【递归入门】组合的输出的相关文章

Problem C: 【递归入门】组合+判断素数

Description 已知 n 个整数b1,b2,…,bn 以及一个整数 k(k<n). 从 n 个整数中任选 k 个整数相加,可分别得到一系列的和. 例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34. 现在,要求你计算出和为素数共有多少种. 例如上例,只有一种的和为素数:3+7+19=29. Input 第一行两个整数:n , k (1<=n<=20,k&

组合的输出(回溯、dfs)

问题 O: [回溯法]组合的输出 题目描述 排列与组合是常用的数学方法,其中组合就是从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<

洛谷P1157 组合的输出

洛谷1157 组合的输出 题目描述 排列与组合是常用的数学方法,其中组合就是从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 输入输出格式 输入格式: 一行两个自

【例5.2】组合的输出

[例5.2]组合的输出 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1317 时间限制: 1000 ms         内存限制: 65536 KB [题目描述] 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,-,n,从中任取r个数. 现要求你用递归的方法输出所有组合. 例如n=5,r=3,所有组合为: 1 2 3   1 2 4   1 2 5   1

用递归通过单字符输出打印多位的数字

#include <iostream> using namespace std; void printDigit( int n ) { cout << n; } void printOut( int n ) // Print nonnegative n { if( n >= 10 ) printOut( n / 10 ); printDigit( n % 10 ); } int main( ) { printOut( 1369 ); cout << endl; r

C程序设计的抽象思维-递归入门

[斐波那契序列] 序列中的每一个新项都是它前两项的和. 0    1     1     2     3      5      8       13       21       34      55       89       144  ---- 数学表达式表示序列中的一个新项:   tN = tN-1 +  tN-2 像这种类型的表达式,序列中的每一个元素都是由先前的元素来确定,这种序列称为递归关系. 斐波那契序列的完整定义如下: tn =  n       n= 0 或者 n= 1 t

Log4Qt快速入门——Log4Qt日志输出重定向源码解析

Log4Qt快速入门--Log4Qt日志输出重定向源码解析 一.Appender简介 1.Appender简介 Appender是所有Appender的抽象类,是对记录日志形式的抽象.Log4Qt(Qt4版本)中Appender继承体系如下: 2.Appender接口 virtual Filter *filter() const = 0; virtual QString name() const = 0; virtual Layout *layout() const = 0; virtual b

5974: 【递归入门】组合+判断素数

地址:http://codeup.cn/problem.php?id=5974 题目描述 已知 n 个整数b1,b2,…,bn 以及一个整数 k(k<n). 从 n 个整数中任选 k 个整数相加,可分别得到一系列的和. 例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34. 现在,要求你计算出和为素数共有多少种. 例如上例,只有一种的和为素数:3+7+19=29. 输入

5972: 【递归入门】全排列

题目描述 排列与组合是常用的数学方法. 先给一个正整数 ( 1 < = n < = 10 ) 例如n=3,所有组合,并且按字典序输出: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 输入 输入一个整数n(  1<=n<=10) 输出 输出所有全排列 每个全排列一行,相邻两个数用空格隔开(最后一个数后面没有空格) 样例输入 3 样例输出 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 这是对昨天学习<算法竞赛入门经典>的复