[递归]组合型枚举

2024-01-17 09:04
文章标签 递归 枚举 组合型

本文主要是介绍[递归]组合型枚举,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

​ 从 1−n 这 n 个整数中随机选取 m 个,每种方案里的数从小到大排列,按字典序输出所有可能的选择方案。


输入

​ 输入两个整数 n,m。(1≤m≤n≤10)

输出

​ 每行一组方案,每组方案中两个数之间用空格分隔。

​ 注意每行最后一个数后没有空格。


样例输入
3 2
样例输出
1 2
1 3
2 3
样例输入2
5 3
样例输出2
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 s

​ 内存限制:256 M

​ 100% 的数据保证 1≤m≤n≤10

 解题分析

创立一个函数,传入两个参数分别递归的位置和上一个位置的数字(用于确保排列是从小到大的)。

使用递归的方式实现从1到n中选取m个数的组合,并按照字典序输出所有可能的选择方案。

首先,定义全局变量n和m,分别表示给定的整数范围和选取的数的个数。还定义了一个数组nums用于存储每个方案中选取的数字,以及一个布尔数组used用于标记数字是否已经被选取。

然后,定义一个递归函数go,该函数有两个参数:pos表示当前已经选取的数字个数,num表示上一个选取的数字。递归的终止条件是当已经选取的数字个数达到m时,将当前方案输出并返回。

在递归函数中,使用一个循环来遍历所有可能的数字。对于每个数字,判断它是否已经被选取(通过used数组判断)以及是否大于上一个选取的数字。如果满足条件,将该数字标记为已选取,存储到nums数组中,并调用递归函数go继续选取下一个数字。递归函数返回后,将该数字的选取状态重置为未选取。

最后,在主函数中读取输入的n和m,并调用go函数开始递归过程。

代码实现
#include <iostream>
using namespace std;
int n,m,nums[11];
bool used[11]={0};void go(int pos,int num){if(pos>m){for(int i=1;i<=m;i++){printf("%d",nums[i]);if(i!=m) printf(" ");}printf("\n");return;}for(int i=1;i<=n;i++){if(used[i]==0 && i>num){used[i]=1;nums[pos]=i;   go(pos+1,i);used[i]=0;}}return;
}int main(){scanf("%d%d",&n,&m);go(1,0);
}

若是不要求按照从小到大的顺序,则为

#include <iostream>
using namespace std;
int n,m,nums[11];
bool used[11]={0};void go(int pos,int num){if(pos>m){for(int i=1;i<=m;i++){printf("%d",nums[i]);if(i!=m) printf(" ");}printf("\n");return;}for(int i=1;i<=n;i++){if(used[i]==0){used[i]=1;nums[pos]=i;   go(pos+1,i);used[i]=0;}}return;
}int main(){scanf("%d%d",&n,&m);go(1,0);
}

这篇关于[递归]组合型枚举的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/615518

相关文章

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

Kotlin 枚举类使用举例

《Kotlin枚举类使用举例》枚举类(EnumClasses)是Kotlin中用于定义固定集合值的特殊类,它表示一组命名的常量,每个枚举常量都是该类的单例实例,接下来通过本文给大家介绍Kotl... 目录一、编程枚举类核心概念二、基础语法与特性1. 基本定义2. 带参数的枚举3. 实现接口4. 内置属性三、

C#之枚举类型与随机数详解

《C#之枚举类型与随机数详解》文章讲解了枚举类型的定义与使用方法,包括在main外部声明枚举,用于表示游戏状态和周几状态,枚举值默认从0开始递增,也可手动设置初始值以生成随机数... 目录枚举类型1.定义枚举类型(main外)2.使用生成随机数总结枚举类型1.定义枚举类型(main外)enum 类型名字

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印