指数级枚举:1到n任意选取的所有方案数:
#include<bits/stdc++.h> using namespace std; int n,a[1100],vis[1100],cnt,m; inline void dfs(int x) { if(x==n) { for(int i=1;i<=n;i++) if(vis[i]) cout<<a[i]<<' '; cout<<endl; return; } vis[x+1]=1; dfs(x+1); vis[x+1]=0; dfs(x+1); } int main() { freopen("1.in","r",stdin); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; dfs(0); }View Code
组合型枚举:1到n中选m个的所有方案数:
#include<bits/stdc++.h> using namespace std; int n,a[1100],vis[1100],cnt,m,o; inline void dfs(int x) { if(o>m||(o+n-x)<m) return; if(x==n) { for(int i=1;i<=n;i++) if(vis[i]) cout<<a[i]<<' '; cout<<endl; cnt++; return; } vis[x+1]=1;o++; dfs(x+1); vis[x+1]=0;o--; dfs(x+1); } int main() { //freopen("1.in","r",stdin); cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; dfs(0); cout<<cnt<<endl; }View Code
排列性枚举:1到n的全排列:
#include<bits/stdc++.h> using namespace std; int n,a[1100],vis[1100],cnt,m,ans[1100]; inline void dfs(int x) { if(x==n) { for(int i=1;i<=n;i++) cout<<a[ans[i]]<<' '; cout<<endl; return; } for(int i=1;i<=n;i++) { if(!vis[i]) { vis[i]=1; ans[x+1]=i; dfs(x+1); vis[i]=0; ans[x+1]=0; } } } int main() { freopen("1.in","r",stdin); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; dfs(0); }View Code