0x03

指数级枚举: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

猜你喜欢

转载自www.cnblogs.com/gcfer/p/10837975.html
今日推荐