首页 > 其他 > 详细

0x03

时间:2019-05-09 14:18:34      阅读:124      评论:0      收藏:0      [点我收藏+]

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

 

0x03

原文:https://www.cnblogs.com/gcfer/p/10837975.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!