指数型枚举
体积 - 小志61314 - 博客园 (cnblogs.com)
每一个数可以分为选和不选的两种情况,这也是一个状态空间了,总共两种情况,可以依次枚举每个数选还是不选,正好做到不重不漏。
首先找到问题的边界,由原问题出发到边界,一层层扩展
每个数选还是不选
一开始每个数都不选,然后到边界每个数都需要经历过选还是不选,这是一个大类,在一个数选择了基础上,下面的依次是选还是不选,(这个地方看代码,下面的递归开始的时候,自然进入到不选的那个递归,直到边界)然后回溯就开始依次选上了,不要忘记还原现场
下面看代码吧
#include
#include
using namespace std;
vector v;
int n;
void dfs(int u)
{
if(u==n+1)
{
for(int i=0;i>n;
dfs(1);
return 0;
}
组合型递归:
谷仓的安保 - 小志61314 - 博客园 (cnblogs.com) 这个是组合型例题
数的划分 - 小志61314 - 博客园 (cnblogs.com)类似的剪枝方法
可以在指数型基础上加入剪枝,因为组合型要求顺序不变,刚好指数型是每一个分支,没有重复的,再在剪枝的基础上加入m变量就可以了
#include
#include
using namespace std;
int n,m;
vector v;
void dfs(int u,int cnt)
{
if(v.size()>m||v.size()+n-u+1>n>>m;
dfs(1,0);
return 0;
}
还有一种就是完全不同的搜索方法
按照字典序从小到大排列且没有重复,直接定义一个start,保证后面的数全部比start大即可
#include
using namespace std;
int n,m;
const int N=50;
int p[N];
void dfs(int u,int start)//第二个保证了是以start开始,以确保不会重复
{
if(u==m+1)
{
for(int i=1;i<=m;i++)
cout<>n>>m;
dfs(1,1);
return 0;
}
排列型递归:
带分数 - 小志61314 - 博客园 (cnblogs.com) 排列型的应用,不过用到了STL的函数(可以不用手搓长代码了QAQ)
#include
using namespace std;
const int N=50;
int n;
int p[N];
bool st[N];//判重,不能有重复
void dfs(int u)
{
if(u==n+1)
{
for(int i=1;i<=n;i++)
cout<>n;
dfs(1);
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)