当前位置: 首页 > news >正文

AcWing93. 递归实现组合型枚举:输出从1~n中随机选出的m个整数

题目

从 1∼ n n n n n n 个整数中随机选出 m m m 个,输出所有可能的选择方案。

输入格式

两个整数 n , m , n,m, n,m, 在同一行用空格隔开。

输出格式

按照从小到大的顺序输出所有方案,每行 1 个。

首先,同一行内的数升序排列,相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。

数据范围

n > 0 n>0 n>0,
0 ≤ m ≤ n 0≤m≤n 0mn,
n + ( n − m ) ≤ 25 n+(n−m)≤25 n+(nm)25

输入样例

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 

思考题:如果要求使用非递归方法,该怎么做呢?

思路

思路类似于AcWing92,但是多了一个个数限制。

另外,因为升序排列,所以可以枚举每个数,就可以形成一棵递归搜索树。可以枚举当前在哪层,以及当前以哪个数开始继续往下搜。

代码

#include <bits/stdc++.h>
#include <vector>
using namespace std;vector<int> chosen; //被选择的数void print_subset(int n, int m, int x) {//剪枝:无解的情况//选择超过了m个,或即使再选上剩余的所有数也不够m个,则无解//这条剪枝保证一旦进入无解的分支就会立刻返回if (chosen.size() > m || chosen.size() + (n - x + 1) < m) {return ;}if (x == n + 1) {for (int i = 0; i < chosen.size(); i++) {printf("%d ", chosen[i]);}printf("\n");return ;}//“选num” 分支chosen.emplace_back(x);//记录num已被选择print_subset(n, m, x + 1); 求解子问题chosen.pop_back(); ///回溯到上一问题之前,还原现场//“不选num” 分支print_subset(n, m, x + 1);}int main() {int n, m;scanf("%d%d", &n, &m);print_subset(n, m, 1);return 0;
}

因为剪枝,时间复杂度从 2 n 2^n 2n 降低为 C n m C_n^m Cnm

递归搜索树写法:

#include <cstdio>
using namespace std;const int N = 30;
int path[N]; //存储路径(选择的数)
int n, m;void dfs(int u, int start) { //u当前层数,start当前在哪个数 if (u > m) { //已经找到了m个数for (int i = 1; i <= m; i++) {printf("%d ", path[i]);}puts("");} else {for (int i = start;  i <= n; i++) {path[u] = i; //当前层选择的数是idfs(u + 1, i + 1);path[u] = 0; //恢复现场}}
}int main() {scanf("%d%d", &n, &m);dfs(1, 1);return 0;
}
http://www.lryc.cn/news/212251.html

相关文章:

  • Java修仙传之Flink篇
  • 网络新闻发稿为何经久不衰?
  • Java SimpleDateFormat 中英文时间格式化转换
  • 机器学习-基本知识
  • Xilinx 7 系列 1.8V LVDS 和 2.5V LVDS 信号之间的 LVDS 兼容性
  • R语言在生态环境领域中的实践技术应用
  • ChineseChess.2023.10.31.01
  • 数据库扩展语句和约束方式以及用户管理
  • JMM 简单理解
  • 微软Azure文本转音频,保存成MP3文件【代码python3】
  • 基于单片机的超声波探伤仪设计
  • idea的设置
  • 高等数学啃书汇总重难点(八)向量代数与空间解析几何
  • C#开发DLL,CAPL调用(CAPL>> .NET DLL)
  • 0-1背包问题【穷举法+二维dp数组】
  • nodejs+vue+python+php基于微信小程序的在线学习平台设计与实现-计算机毕业设计
  • Spring学习笔记2 Spring的入门程序
  • 【Linux】虚拟机安装Linux、客户端工具及Linux常用命令(详细教程)
  • Day 47 动态规划 part13
  • 【广州华锐互动】飞机诊断AR远程指导系统为工程师提供更多支持
  • 【贝叶斯回归】【第 2 部分】--推理算法
  • 【深入浅出汇编语言】寄存器精讲第二期
  • 如何保证分布式情况下的幂等性
  • Mybatis特殊SQL的执行
  • MyBatis-Flex(一):快速开始
  • Vue组件化
  • nodejs+python+php+微信小程序-基于安卓android的健身服务应用APP-计算机毕业设计
  • SpringCloud 微服务全栈体系(九)
  • Mybatis 多对一和一对多查询
  • MySQL的数据库操作、数据类型、表操作