T1317:【例5.2】组合的输出

【题目描述】

排列与组合是常用的数学方法,其中组合就是从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)。

【输出】

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

【输入样例】

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

解题思路

  全排列变形,判断条件要增加一个:后一个数大于前一个数;

代码如下

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int n, r, st[1010];
 5 bool book[1010];
 6 void dfs(int u){
 7     if(u == r + 1){
 8
 9         for(int i = 1; i <= r; i++)    printf("%3d", st[i]);
10         printf("\n");
11     }
12
13     for(int i = 1; i <= n; i++){
14         if(!book[i] && st[u - 1] < i){
15             st[u] = i;
16             book[i] = true;
17             dfs(u + 1);
18             book[i] = false;
19         }
20     }
21
22
23 }
24 int main(){
25     scanf("%d %d", &n, &r);
26     dfs(1);
27     return 0;
28 } 





原文地址:https://www.cnblogs.com/zoom1109/p/11175392.html

时间: 2024-08-06 11:27:14

T1317:【例5.2】组合的输出的相关文章

【例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

组合的输出

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

组合的输出(回溯、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 输入输出格式 输入格式: 一行两个自

P1157 组合的输出

排列与组合是常用的数学方法,其中组合就是从nn个元素中抽出rr个元素(不分顺序且r \le n)r≤n),我们可以简单地将nn个元素理解为自然数1,2,…,n1,2,…,n,从中任取rr个数. 现要求你不用递归的方法输出所有组合. 例如n=5,r=3n=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 5123,124,125,134,135,145,234,235,245

随机排列组合的输出

在算法的书本上描述了这样的一个问题:有3个白球,4个黑球,5个蓝球,请输出一共有多少种组合,与此同时,输出每一种组合的方式.这个问题,我一直都在思考,虽然我知道早已经有了答案.递归总是让我知道自己的蹩脚的逻辑.我的倔强的脾气让我一直都在研究,到底应该如何写这个递归的方程式.今天晚上写了一个模糊的算法,还只是一个不能实现的雏形. 随机排列组合:  m个红球 , n个白球, l个蓝球 递归的函数如下: int list(m,n,l) { if(m>1) { list(m-1,n,l); } if(n

【递归入门】组合的输出

题目描述 排列与组合是常用的数学方法,其中组合就是从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 ). 输出 所有的组

C++入门经典-例3.23-使用嵌套循环输出乘法口诀表

1:代码如下: // 3.23.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iomanip> #include <iostream> using namespace std; void main(void) { int i,j; i=1; j=1; for(i=1;i<10;i++) { for(j=1;j<i+1;j++) cout << i << "

深度优先DFS-----例3 例4

例3:组合问题 输出m个数中取n个数的所有组合.例如m=5,n=3的所有组合为:1      2      31      2      41      2      5 1      3      41      3      51      4      5 2      3      42      3      52      4      5 3      4      5 #include<iostream> using namespace std; int m,n,a[10];