[递归]组合型枚举

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

相关文章

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 的阶乘(二)顺序打印

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景