ACWing93.递归实现组合型枚举
题面
\93. 递归实现组合型枚举
从 1∼n
这 n 个整数中随机选出 m
个,输出所有可能的选择方案。
输入格式
两个整数 n,m
,在同一行用空格隔开。
输出格式
按照从小到大的顺序输出所有方案,每行 1
个。
首先,同一行内的数升序排列,相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如
1 3 5 7排在1 3 6 8前面)。数据范围
n>0
,
0≤m≤n ,
n+(n−m)≤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.递归实现组合型枚举的更多相关文章
- ACAG 0x02-8 非递归实现组合型枚举
ACAG 0x02-8 非递归实现组合型枚举 之所以专门来写这道题的博客,是因为感觉从最根本处了解到了递归的机器实现. 主要的就是两个指令--Call和Ret. Call指令会将返回地址入栈(系统栈) ...
- AcWing 93. 递归实现组合型枚举
AcWing 93. 递归实现组合型枚举 原题链接 从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案. 输入格式 两个整数 n,m ,在同一行用空格隔开. 输出格式 按照从小到大的 ...
- 【ACwing 93】【模版】非递归实现组合型枚举——模拟递归
(题面来自ACwing) 从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案. 输入格式 两个整数 n,m ,在同一行用空格隔开. 输出格式 按照从小到大的顺序输出所有方案,每行1个 ...
- 4位组合型Excel文档密码怎么破解
现代社会我们会遇到各种密码,很多的密码我们一段时间不用就不知不觉的忘记了.很多的excel用户就遇到过这种情况,这个时候我们就需要一款Excel密码破解工具.Advanced Office Passw ...
- RxJava 1.x 笔记:组合型操作符
最近去检查眼睛,发现度数又涨了,唉,各位猿多注意保护自己的眼睛吧! 前面学了 RxJava 的三种关键操作符: 创建型操作符 过滤型操作符 变换型操作符 读完本文你将了解第四种(组合型操作符): 组合 ...
- Kubernetes用户指南(二)--部署组合型的应用、连接应用到网络中
一.部署组合型的应用 1.使用配置文件启动replicas集合 k8s通过Replication Controller来创建和管理各个不同的重复容器集合(实际上是重复的pods). Replicati ...
- AcWing 94. 递归实现排列型枚举
AcWing 94. 递归实现排列型枚举 题目链接 把 1~n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序. 输入格式 一个整数n. 输出格式 按照从小到大的顺序输出所有方案,每行1个. ...
- ACWing94. 递归实现排列型枚举
题面 把 1∼n 这 n个整数排成一行后随机打乱顺序,输出所有可能的次序. 输入格式 一个整数 n. 输出格式 按照从小到大的顺序输出所有方案,每行 1 个. 首先,同一行相邻两个数用一个空格隔开. ...
- 0x02 递推与递归
[例题]CH0301 递归实现指数型枚举 #include <iostream> #include <cstdio> #include <algorithm> #i ...
随机推荐
- 【Azure Developer】使用 Microsoft Authentication Libraries (MSAL) 如何来获取Token呢 (通过用户名和密码方式获取Access Token)
问题描述 在上一篇博文<[Azure Developer]使用 adal4j(Azure Active Directory authentication library for Java)如何来 ...
- selenium模块使用详解、打码平台使用、xpath使用、使用selenium爬取京东商品信息、scrapy框架介绍与安装
今日内容概要 selenium的使用 打码平台使用 xpath使用 爬取京东商品信息 scrapy 介绍和安装 内容详细 1.selenium模块的使用 # 之前咱们学requests,可以发送htt ...
- drools的简单入门案例
一.背景 最近在学习规则引擎drools,此处简单记录一下drools的入门案例. 二.为什么要学习drools 假设我们存在如下场景: 在我们到商店购买衣服的时候,经常会发生这样的事情,购买1件不打 ...
- MOSFET, MOS管, 开关管笔记
MOSFET, MOS管, 开关管 MOSFET, Metal-Oxide-Semiconductor Field-Effect Transistor, 金属氧化物半导体场效晶体管 常见封装 电路符号 ...
- arthas学习图文记录
Arthas 是阿里开源的 Java 诊断工具.在线排查问题,无需重启:动态跟踪 Java 代码:实时监控 JVM 状态.Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采 ...
- Mac下iTerm2安装rzsz后上传下载失败解决
背景描述 mac环境,安装了iTerm2,需要使用ssh登陆linux服务器.服务器登陆需要经过以下步骤 输入token 输入登陆选项 输入IP 因此写了expect脚本来完成自动输入 但是在上传下载 ...
- IDEA找不到类但实际存在的问题解决
不知道某天开始Idea就开始抽风了. 现象: 一个service的接口类,就在同一个包下,但总是找不到,编辑器一直标红 编译可以通过 说明类本身应该是没什么问题的.问题是怎么重新编译重新reload ...
- Java 进阶路线图
前言 个人的从事Java开发行业已经也有一段时间,提升自己的Java水平,特整理下学习路线图,以备日后使用. 路线图资料收集 图片打不开,建议使用复制链接打开:或者私信告诉我. Java架构师学习路线 ...
- conda install和pip install区别
conda ≈ pip(python包管理) + virtualenv(虚拟环境) + 非python依赖包管理 级别不一样conda和yum比较类似,可以安装很多库,不限于Python.conda是 ...
- 前端ES6 特性兼容查询
ES6 http://kangax.github.io/compat-table/es6/ ES5 http://kangax.github.io/compat-table/es5/ ES 2016+ ...