// 递归实现指数型枚举
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. 算法作业1:遍历与枚举

    本文持续更新 Update date: 2021/10/6 算法系列文章 搜索算法:遍历与枚举 分治算法:修身,齐家,编算法! 笔记目录 什么是枚举? 什么时候用枚举? 机器学习中的枚举 特征选择(f ...

  2. Java基础之面向对象的概念 继承---组合----枚举类

    Java基础之面向对象的概念 继承---组合----枚举类 本章作为面向对象概念的最后一篇,但是作为一名java程序员在面向对象的这条路上还很长. 一.继承与组合简介 继承是实现类重用的重要手段,但是 ...

  3. NSDictionary使用枚举方法

    在字典当中我们同样可以使用枚举方法, 通过枚举方法逐个打印里面的键和值. 这里涉及的方法: keyEnumerator:通过一个枚举器可以访问并返回字典里的键. objectEnumerator:通过 ...

  4. 枚举方法在swtch中的用法

    在写汤姆猫的代码时,将汤姆猫的各种动作全都链接到了一个IBAction中,区分这些方法的是它们不同的tag 但是为了在后面写代码时方便观察审阅,可以用到枚举方法 在枚举中对第一个项目设定了值以后,后面 ...

  5. win 10 无法删除系统文件的解决方法(提示:无法枚举容器中的对象 访问被拒绝)

    win 10 无法删除系统文件的解决方法(提示:无法枚举容器中的对象 访问被拒绝) 参考文章: (1)win 10 无法删除系统文件的解决方法(提示:无法枚举容器中的对象 访问被拒绝) (2)http ...

  6. 『ACM-算法-枚举法』信息竞赛进阶指南--枚举方法

    你以为枚举是一个一个的找? 还真是 你以为枚举都是for循环? 还真是 但你真的会枚举吗?组合型枚举,指数型枚举,排列型枚举?难道你只会线形枚举? 你可太菜了! // 递归实现指数型枚举 vector ...

  7. c语言枚举法课程设计报告,枚举法的程序实现及优化

    计新明 内容分析 本部分内容是教育科学出版社出版的必修1<数据与计算>第四单元第一节中的内容,整本书的思路是初始数据与计算.编程计算.认识数据.计算与问题解决.数据分析与人工智能,第四章属 ...

  8. java 7种枚举类型_Java中的枚举类型

    枚举类比较用 == 还是 equals,有啥区别? java 枚举值比较用 == 和 equals 方法没啥区别,两个随便用都是一样的效果.因为枚举 Enum 类的 equals 方法默认实现就是通过 ...

  9. java 枚举使用简书_java枚举类型使用和详解

    1.定义 An enum type is a special data type that enables for a variable to be a set of predefined const ...

  10. 枚举类型enum用法_Java枚举深度解读,看这篇就够了

    作者 | 涛GuoGuo的跟屁虫丶博Ke 来源 | urlify.cn/aaamQf 66套java从入门到精通实战课程分享 Java枚举 1.枚举类概念的理解与定义 一个类的对象是有限个,确定的,我 ...

最新文章

  1. 如果现在只能用汇编和 Goto 编程......
  2. java 异常_Java 进阶之异常处理
  3. DAY7-Python学习笔记
  4. Sizzle引擎--原理与实践(二)
  5. vue 关闭log_vue或react项目生产环境去掉console.log的操作
  6. 题目1022:游船出租
  7. [.net 面向对象编程基础] (13) 面向对象三大特性——多态
  8. 轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑
  9. ssl初一组周六模拟赛【2018.4.14】
  10. REVERSE-COMPETITION-NEPCTF
  11. 显示当前没有家庭组计算机,已创建家庭组且加入家庭组,但显示“当前没有其他可用的家庭组计算机?”...
  12. 第七讲 塔木德破产分配法练习题
  13. 零基础学python实战-Python3.6零基础入门与实战 PDF 带源码视频版
  14. 祝贺泰山OFFICE CDKEY长度25,吾已成为顶级CDKEY砖家
  15. unity技美31——Curvy Splines寻路插件绘制赛道,并且生成OBJ教程
  16. linux 检查ntp版本,查看linux安装ntp服务器配置
  17. 那一只蝴蝶飞不过沧海
  18. Unity 2D 闪电特效
  19. TencentOS-tiny 时间管理(十 六)- 时间片轮转机制
  20. c++解析tcp头部遇到的大小端转换问题

热门文章

  1. 利用QCommonStyle绘制自定义的窗体部件
  2. php数组foreach循环添加键值对_在PHP的foreach循环中插入一个$key作为变量
  3. pycharm 类型注释_学习Python第一步,变量与数据类型
  4. java银行叫号模拟系统_Java 模拟银行叫号机
  5. post 表单中常见的四种表单请求方式
  6. java中哈希表怎么表示_java中HashMap概念是什么?怎么存取实现它?
  7. 从集合中查找最值得方法——max(),min(),nlargest(),nsmallest()
  8. Spark2.4.0 SparkEnv 源码分析
  9. 解决华为交换机S5700无法解除ip/Mac绑定的问题
  10. 用几何画板演示涡旋电场的方法