ACM算法--枚举方法(指数枚举,组合枚举)模板
// 递归实现指数型枚举
vector<int> chosen;
void calc(int x) {if (x == n + 1) {for (int i = 0; i < chosen.size(); i++)printf("%d ", chosen[i]);puts("");return;}calc(x + 1);chosen.push_back(x);calc(x + 1);chosen.pop_back();
}// 递归实现组合型枚举
vector<int> chosen;
void calc(int x) {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]);puts("");return;}calc(x + 1);chosen.push_back(x);calc(x + 1);chosen.pop_back();
}// 递归实现排列型枚举
int order[20];
bool chosen[20];
void calc(int k) {if (k == n + 1) {for (int i = 1; i <= n; i++)printf("%d ", order[i]);puts("");return;}for (int i = 1; i <= n; i++) {if (chosen[i]) continue;order[k] = i;chosen[i] = 1;calc(k + 1);chosen[i] = 0;order[k] = 0;}
}// 模拟机器实现,把组合型枚举改为非递归
vector<int> chosen;
int stack[100010], top = 0, address = 0;void call(int x, int ret_addr) { // 模拟计算机汇编指令callint old_top = top;stack[++top] = x; // 参数xstack[++top] = ret_addr; // 返回地址标号stack[++top] = old_top; // 在栈顶记录以前的top值
}int ret() { // 模拟计算机汇编指令retint ret_addr = stack[top - 1];top = stack[top]; // 恢复以前的top值return ret_addr;
}int main() {int n, m;cin >> n >> m;call(1, 0); // calc(1)while (top) {int x = stack[top - 2]; // 获取参数switch (address) {case 0:if (chosen.size() > m || chosen.size() + (n - x + 1) < m) {address = ret(); // returncontinue;}if (x == n + 1) {for (int i = 0; i < chosen.size(); i++)printf("%d ", chosen[i]);puts("");address = ret(); // returncontinue;}call(x + 1, 1); // 相当于calc(x + 1),返回后会从case 1继续执行address = 0;continue; // 回到while循环开头,相当于开始新的递归case 1:chosen.push_back(x);call(x + 1, 2); // 相当于calc(x + 1),返回后会从case 2继续执行address = 0;continue; // 回到while循环开头,相当于开始新的递归case 2:chosen.pop_back();address = ret(); // 相当于原calc函数结尾,执行return}}
}
ACM算法--枚举方法(指数枚举,组合枚举)模板相关推荐
- 算法作业1:遍历与枚举
本文持续更新 Update date: 2021/10/6 算法系列文章 搜索算法:遍历与枚举 分治算法:修身,齐家,编算法! 笔记目录 什么是枚举? 什么时候用枚举? 机器学习中的枚举 特征选择(f ...
- Java基础之面向对象的概念 继承---组合----枚举类
Java基础之面向对象的概念 继承---组合----枚举类 本章作为面向对象概念的最后一篇,但是作为一名java程序员在面向对象的这条路上还很长. 一.继承与组合简介 继承是实现类重用的重要手段,但是 ...
- NSDictionary使用枚举方法
在字典当中我们同样可以使用枚举方法, 通过枚举方法逐个打印里面的键和值. 这里涉及的方法: keyEnumerator:通过一个枚举器可以访问并返回字典里的键. objectEnumerator:通过 ...
- 枚举方法在swtch中的用法
在写汤姆猫的代码时,将汤姆猫的各种动作全都链接到了一个IBAction中,区分这些方法的是它们不同的tag 但是为了在后面写代码时方便观察审阅,可以用到枚举方法 在枚举中对第一个项目设定了值以后,后面 ...
- win 10 无法删除系统文件的解决方法(提示:无法枚举容器中的对象 访问被拒绝)
win 10 无法删除系统文件的解决方法(提示:无法枚举容器中的对象 访问被拒绝) 参考文章: (1)win 10 无法删除系统文件的解决方法(提示:无法枚举容器中的对象 访问被拒绝) (2)http ...
- 『ACM-算法-枚举法』信息竞赛进阶指南--枚举方法
你以为枚举是一个一个的找? 还真是 你以为枚举都是for循环? 还真是 但你真的会枚举吗?组合型枚举,指数型枚举,排列型枚举?难道你只会线形枚举? 你可太菜了! // 递归实现指数型枚举 vector ...
- c语言枚举法课程设计报告,枚举法的程序实现及优化
计新明 内容分析 本部分内容是教育科学出版社出版的必修1<数据与计算>第四单元第一节中的内容,整本书的思路是初始数据与计算.编程计算.认识数据.计算与问题解决.数据分析与人工智能,第四章属 ...
- java 7种枚举类型_Java中的枚举类型
枚举类比较用 == 还是 equals,有啥区别? java 枚举值比较用 == 和 equals 方法没啥区别,两个随便用都是一样的效果.因为枚举 Enum 类的 equals 方法默认实现就是通过 ...
- java 枚举使用简书_java枚举类型使用和详解
1.定义 An enum type is a special data type that enables for a variable to be a set of predefined const ...
- 枚举类型enum用法_Java枚举深度解读,看这篇就够了
作者 | 涛GuoGuo的跟屁虫丶博Ke 来源 | urlify.cn/aaamQf 66套java从入门到精通实战课程分享 Java枚举 1.枚举类概念的理解与定义 一个类的对象是有限个,确定的,我 ...
最新文章
- 如果现在只能用汇编和 Goto 编程......
- java 异常_Java 进阶之异常处理
- DAY7-Python学习笔记
- Sizzle引擎--原理与实践(二)
- vue 关闭log_vue或react项目生产环境去掉console.log的操作
- 题目1022:游船出租
- [.net 面向对象编程基础] (13) 面向对象三大特性——多态
- 轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑
- ssl初一组周六模拟赛【2018.4.14】
- REVERSE-COMPETITION-NEPCTF
- 显示当前没有家庭组计算机,已创建家庭组且加入家庭组,但显示“当前没有其他可用的家庭组计算机?”...
- 第七讲 塔木德破产分配法练习题
- 零基础学python实战-Python3.6零基础入门与实战 PDF 带源码视频版
- 祝贺泰山OFFICE CDKEY长度25,吾已成为顶级CDKEY砖家
- unity技美31——Curvy Splines寻路插件绘制赛道,并且生成OBJ教程
- linux 检查ntp版本,查看linux安装ntp服务器配置
- 那一只蝴蝶飞不过沧海
- Unity 2D 闪电特效
- TencentOS-tiny 时间管理(十 六)- 时间片轮转机制
- c++解析tcp头部遇到的大小端转换问题
热门文章
- 利用QCommonStyle绘制自定义的窗体部件
- php数组foreach循环添加键值对_在PHP的foreach循环中插入一个$key作为变量
- pycharm 类型注释_学习Python第一步,变量与数据类型
- java银行叫号模拟系统_Java 模拟银行叫号机
- post 表单中常见的四种表单请求方式
- java中哈希表怎么表示_java中HashMap概念是什么?怎么存取实现它?
- 从集合中查找最值得方法——max(),min(),nlargest(),nsmallest()
- Spark2.4.0 SparkEnv 源码分析
- 解决华为交换机S5700无法解除ip/Mac绑定的问题
- 用几何画板演示涡旋电场的方法