题面

\93. 递归实现组合型枚举

从 1∼n

n 个整数中随机选出 m

个,输出所有可能的选择方案。

输入格式

两个整数 n,m

,在同一行用空格隔开。

输出格式

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

个。

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

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

数据范围

n>0

,
0≤mn ,
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

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

题解

搜索以及剪枝(就是在发现已经不可能得到解的情况下立即返回,可以使时间复杂度大大地下降)

题目中所给的顺序,可以直接使用DFS的顺序来实现。

剪枝的条件:当已经选了的大于了M或者再加上剩下要选的都不能达到M。

代码——使用递归算法

#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<int> chosen;
void DFS(int x)
{
if(chosen.size() > m || chosen.size() + (n-x+1) < m)
return;
if(chosen.size() == m)//要注意
{
for(int i = 0; i < chosen.size(); i++)
{
printf("%d ", chosen[i]);
}
putchar(10);
return;
}
chosen.push_back(x);
DFS(x+1);
chosen.pop_back();
DFS(x+1);
}
int main()
{
scanf("%d%d", &n, &m);
DFS(1);
return 0;
}

使用非递归算法

#include <bits/stdc++.h>
using namespace std;
vector<int> chosen;
int top = 0;
int address =0 ;
//int stac[100];
int stac[100010];
void call(int x, int ret_address)
{
int old_top = top;
stac[++top] = x;
stac[++top] = ret_address;
stac[++top] = old_top;
}
int ret()
{
int ret_address = stac[top-1];
top = stac[top];
return ret_address;
}
int m, n;
int main()
{
scanf("%d%d", &n, &m);
call(1, 0);
while(top)
{
int x = stac[top-2];
switch(address)
{
case 0:
if(chosen.size() > m || chosen.size() + (n-x+1) < m)
{
address = ret();
continue;
}
if(chosen.size()==m)
{
for(int i = 0; i < chosen.size(); i++)
{
printf("%d ", chosen[i]);
}
putchar('\n');
address = ret();
continue;
}
chosen.push_back(x);
call(x+1, 1);
address = 0;
continue;
case 1:
chosen.pop_back();
call(x+1, 2);
address = 0;
continue;
case 2: address = ret();
continue;
}
}
return 0;
}

ACWing93.递归实现组合型枚举的更多相关文章

  1. ACAG 0x02-8 非递归实现组合型枚举

    ACAG 0x02-8 非递归实现组合型枚举 之所以专门来写这道题的博客,是因为感觉从最根本处了解到了递归的机器实现. 主要的就是两个指令--Call和Ret. Call指令会将返回地址入栈(系统栈) ...

  2. AcWing 93. 递归实现组合型枚举

    AcWing 93. 递归实现组合型枚举 原题链接 从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案. 输入格式 两个整数 n,m ,在同一行用空格隔开. 输出格式 按照从小到大的 ...

  3. 【ACwing 93】【模版】非递归实现组合型枚举——模拟递归

    (题面来自ACwing) 从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案. 输入格式 两个整数 n,m ,在同一行用空格隔开. 输出格式 按照从小到大的顺序输出所有方案,每行1个 ...

  4. 4位组合型Excel文档密码怎么破解

    现代社会我们会遇到各种密码,很多的密码我们一段时间不用就不知不觉的忘记了.很多的excel用户就遇到过这种情况,这个时候我们就需要一款Excel密码破解工具.Advanced Office Passw ...

  5. RxJava 1.x 笔记:组合型操作符

    最近去检查眼睛,发现度数又涨了,唉,各位猿多注意保护自己的眼睛吧! 前面学了 RxJava 的三种关键操作符: 创建型操作符 过滤型操作符 变换型操作符 读完本文你将了解第四种(组合型操作符): 组合 ...

  6. Kubernetes用户指南(二)--部署组合型的应用、连接应用到网络中

    一.部署组合型的应用 1.使用配置文件启动replicas集合 k8s通过Replication Controller来创建和管理各个不同的重复容器集合(实际上是重复的pods). Replicati ...

  7. AcWing 94. 递归实现排列型枚举

    AcWing 94. 递归实现排列型枚举 题目链接 把 1~n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序. 输入格式 一个整数n. 输出格式 按照从小到大的顺序输出所有方案,每行1个. ...

  8. ACWing94. 递归实现排列型枚举

    题面 把 1∼n 这 n个整数排成一行后随机打乱顺序,输出所有可能的次序. 输入格式 一个整数 n. 输出格式 按照从小到大的顺序输出所有方案,每行 1 个. 首先,同一行相邻两个数用一个空格隔开. ...

  9. 0x02 递推与递归

    [例题]CH0301 递归实现指数型枚举 #include <iostream> #include <cstdio> #include <algorithm> #i ...

随机推荐

  1. 使用requests爬取梨视频、bilibili视频、汽车之家,bs4遍历文档树、搜索文档树,css选择器

    今日内容概要 使用requests爬取梨视频 requests+bs4爬取汽车之家 bs4遍历文档树 bs4搜索文档树 css选择器 内容详细 1.使用requests爬取梨视频 # 模拟发送http ...

  2. 【算法】计数排序(Counting Sort)(八)

    计数排序(Counting Sort) 计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中. 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范 ...

  3. Java异常处理最佳实践

    总结一些Java异常的处理原则 Java异常处理最佳实践 不要忘记关闭资源 在finally里关闭资源 public void readFile() { FileInputStream fileInp ...

  4. Java获取特定区间随机数及产生不重复随机数

    问题 有这样一种需求,在这样一个数组中String[] arr = new String[]{"电商", "互联网", "小程序", &qu ...

  5. 学习Java的第十七天——大数字运算

    学习内容:大数字运算 代码实现: package 数字处理类; import java.math.BigInteger; public class BigIntegerDemo { public st ...

  6. CSS基础学习(二)

    11.CSS背景 ①设置背景颜色(颜色值通常可以用十六进制(如#000000)或者颜色名称(如red)来表示) 属性:background-color 例: body { background-col ...

  7. 每天一个 HTTP 状态码 200

    200 OK 话不多说,这个状态码应该是最最最常用的了,无人不知,无人不晓: 就是表示请求成功的意思,你若安好,便是晴天. 摘自对于 https://www.google.com/ GET 请求的响应 ...

  8. js颜色调试器

    1 /* ColorTestViewer 颜色调试器 2 3 attribute: 4 onchange: Function; //颜色改变回调; 默认null 5 6 //以下属性不建议直接修改 7 ...

  9. PX4配置过程与踩坑

    0.前言 由于需要在GitHub下载代码,而国内访问受限,可能会出现一些问题,这里建议使用github国内镜像,参看:GitHub国内镜像网站,当然下面会给出具体解决方案. 1.步骤 1.1下载源码: ...

  10. CPPRESTSDK 编译

    首先要 git clone这个库git clone git://github.com/Microsoft/cpprestsdk.git然后git 一下 Vcpkg.\vcpkg\bootstrap-v ...