递推与递归专题练习

匿名 (未验证) 提交于 2019-12-02 23:05:13

搜索与回溯,指数级算法。

#include<bits/stdc++.h> #define rg register #define il inline #define co const template<class T>il T read(){     rg T data=0,w=1;     rg char ch=getchar();     while(!isdigit(ch)){         if(ch=='-') w=-1;         ch=getchar();     }     while(isdigit(ch))         data=data*10+ch-'0',ch=getchar();     return data*w; } template<class T>il T read(rg T&x){     return x=read<T>(); } typedef long long ll; using namespace std; vector<int>chosen; int n; void dfs(int x){     if(x==n+1){         for(unsigned i=0;i<chosen.size();++i)             printf("%d ",chosen[i]);         puts("");         return;     }     dfs(x+1);     chosen.push_back(x);     dfs(x+1);     chosen.pop_back(); } int main(){ //  freopen(".in","r",stdin); //  freopen(".out","w",stdout);     read(n);     dfs(1);     return 0; }

搜索与回溯。要字典序最小,所以优先往加入当前节点的分支搜索。

#include<bits/stdc++.h> #define rg register #define il inline #define co const template<class T>il T read(){     rg T data=0,w=1;     rg char ch=getchar();     while(!isdigit(ch)){         if(ch=='-') w=-1;         ch=getchar();     }     while(isdigit(ch))         data=data*10+ch-'0',ch=getchar();     return data*w; } template<class T>il T read(rg T&x){     return x=read<T>(); } typedef long long ll; using namespace std; vector<int> chosen; unsigned n,m; void dfs(unsigned x){     if(chosen.size()>m||chosen.size()+(n-x+1)<m)         return;     if(x==n+1){         for(unsigned i=0;i<chosen.size();++i)             printf("%d ",chosen[i]);         puts("");         return;     }     chosen.push_back(x);     dfs(x+1);     chosen.pop_back();     dfs(x+1); } int main(){ //  freopen(".in","r",stdin); //  freopen(".out","w",stdout);     read(n),read(m);     dfs(1);     return 0; }

搜索与回溯

#include<bits/stdc++.h> #define rg register #define il inline #define co const template<class T>il T read(){     rg T data=0,w=1;     rg char ch=getchar();     while(!isdigit(ch)){         if(ch=='-') w=-1;         ch=getchar();     }     while(isdigit(ch))         data=data*10+ch-'0',ch=getchar();     return data*w; } template<class T>il T read(rg T&x){     return x=read<T>(); } typedef long long ll; int n,order[11]; bool chosen[11]; void dfs(int x){     if(x==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]){         chosen[i]=1,order[x]=i;         dfs(x+1);         chosen[i]=0;     } } int main(){ //  freopen(".in","r",stdin); //  freopen(".out","w",stdout);     read(n);     dfs(1);     return 0; }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!