这类枚举题目基本依靠$dfs$然后回溯的方法即可完成
一、递归指数型枚举
题意:
给出$n$,从$1$至$n$中随机选择任意多个,输出可能的选择方案。
题解:
首先开一个栈,记录每一层的起点将它加入到栈中,然后下一层一定会从这个起点的下个点出发,然后把它加入栈中,下一层再从其下一个点出发。然后当层数到达设置的值时则输出栈中内容然后回溯退栈,再从该层的标记点的第$2,3......$个点出发继续递归,如果超过$n$则直接返回。最后枚举层数从$0$至$n$即可。
AC代码见acwing92。
二、递归组合型枚举
题意:
给出$n$和$m$,求从$1$到$n$当中选择$m$个数的方案。
题解:
上一题固定层数为$m$即可。
AC代码见acwing93。
三、递归排列型枚举
题意:
用递归的方法输出$n$所有的排列。
题解:
其实直接使用$next-permutation$就行,但是我们这次使用递归,我们直接将标记全部从$1$开始,然后使用一个$vis$数组记录该数是否已经被访问,如果没有就选,然后标记$vis$,继续递归,回溯时消除$vis$标记即可。
AC代码见acwing94。