DFS(重点是枚举的顺序)
一:递归实现指数型枚举(枚举每个位置选/不选)
例题:递归实现指数型枚举
递归搜索树:
n最大为15,时间复杂度n*2^n
二:递归实现排列型枚举(枚举每个数放到哪个位置/枚举每个位置放哪个数)
例题:递归实现排列型枚举
递归搜索树:
n最大为9,时间复杂度n*n!
三:递归实现组合型枚举
排列型枚举是考虑各数间的顺序,组合型枚举不考虑顺序;
例题:递归实现组合型枚举
我第一次写的代码:(将排列型枚举加一个判断条件即可,运行时间1500ms+
#include<iostream>
using namespace std;
int n,m;
const int N=26;
int st[N];
bool used[N];
void dfs(int x){
if(x==m+1){
for(int i=1;i<=m;i++) cout<<st[i]<<" ";
cout<<endl;
return;
}
for(int i=1;i<=n;i++){
if(!used[i] &&i>st[x-1]){
used[i]=true;
st[x]=i;
dfs(x+1);
st[x]=0;
used[i]=false;
}
}
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
dfs(1);
return 0;
}
看了y总视频后
不剪枝运行时间:200ms
剪枝运行时间:94ms
代码:
#include<iostream>
using namespace std;
int n,m;
const int N=26;
int st[N];
void dfs(int x,int start){
if(x+n-start<m) return;
if(x==m+1){
for(int i=1;i<=m;i++) cout<<st[i]<<" ";
cout<<endl;
return;
}
for(int i=start;i<=n;i++){
st[x]=i;
dfs(x+1,i+1);
st[x]=0;
}
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
dfs(1,1);
return 0;
}