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 ...
随机推荐
- PHP代码审计之命令注入攻击
PHP漏洞-命令注入攻击 命令注入攻击 PHP中可以使用下列5个函数来执行外部的应用程序或函数 system.exec.passthru.shell_exec.``(与shell_exec功能相同) ...
- mySql in 语句查询优化
有这么一条sql UPDATE product set BuyerCount =BuyerCount+1 where ProductId in( SELECT ProductId from order ...
- BFC 是什么?
BFC 是什么? 本文写于 2020 年 7 月 17 日 总有同学问我:"这个 div 为什么会插出来?为什么 float 的 div 这么不好操作?".这其实就是没有深入理解 ...
- OpenHarmony3.1 Release版本关键特性解析——Enhanced SWAP内存管理
樊成阳 华为技术有限公司内核专家 陈杰 华为技术有限公司内核专家 OpenAtom OpenHarmony(以下简称"OpenHarmony")是面向全场景泛终端设备的操作系统,终 ...
- k8s的api资源
NAME SHORTNAMES APIGROUP NAMESPACED KIND 资源用途说明 bindings TRUE Binding 已弃用.用于记录一个object和另一个object ...
- 【雅礼集训 2017 Day2】棋盘游戏
loj 6033 description 给一个\(n*m\)的棋盘,'.'为可通行,'#'为障碍.Alice选择一个起始点,Bob先手从该点往四个方向走一步,Alice再走,不能走走过的点,谁不能动 ...
- ES6 - promise(1)
今天决定对之前学过的一些前端的知识进行梳理和总结,因为最近都是独自承担项目的开发与搭建,所以先从前后端交互的第一线axios来梳理,复习axios首先一定要先复习promise对象. 什么是promi ...
- JavaScript数据类型BigInt实践之id数值太大,导致前后端交互异常
项目开发中前后端数据交互常会使用id作为主键索引,通常id数值都不大,使用number类型就可以表示处理,但对于一些分布式id或其他情况,id数值太大且超过了JS的最大处理数(Math.pow(2, ...
- 线程安全性-原子性之synchronized锁
原子性提供了互斥访问:同一时刻只能有一个线程进行操作: 除了Atomic包类之外,还有锁可以实现此功能: synchronized: java关键字,依赖于jvm实现锁功能,被此关键字所修饰的,都是 ...
- CSS(九):background(背景属性)
通过CSS背景属性,可以给页面元素添加背景样式. 背景属性可以设置背景颜色.背景图片.背景平铺.背景图像固定等. background-color(背景颜色) background-color属性定义 ...