zoukankan      html  css  js  c++  java
  • dfs--全排列

    输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

    输入格式

    n(1≤n≤9)

    输出格式

    由1~n组成的所有不重复的数字序列,每行一个序列。每个数字保留5个场宽

    我们要把1到n个数字任意组合,且组合不重复,按照从小到大排序

    vis数组:表示这个数字是否用到过

    每次判断数字是否之前便使用过,如果没有使用过,即选择这个数字 vis[]=1,继续dfs,在dfs之后,把这个数字重新还原以便下次使用

    1  for (int i = 1;i <= n;i++)
    2     {
    3         if (vis[i]==0)
    4         {
    5         vis[i] = 1;
    6         a[x] = i;
    7         dfs(x+1);
    8         vis[i] = 0;
    9     }

    当重复过n次后,及证明每个数字都已经被选择,我们就从头输出

    //给有一个整数n,1~n个数全排列 
    #include <iostream>
    #include <cstdio>
    using namespace std;
    bool vis[100];
    int a[100];
    int n;
    void dfs(int x)
    {
        if (x == n+1)
        {
            for (int i = 1;i <= n;i++)
            {
                    printf ("%5d",a[i]);
            }
            cout<<endl;
            return;
        }
        for (int i = 1;i <= n;i++)
        {
            if (vis[i]==0)
            {
            vis[i] = 1;
            a[x] = i;
            dfs(x+1);
            vis[i] = 0;
        }
    }
    }
    int main()
    {
        scanf ("%d",&n); 
        dfs(1);
        return 0;
    }

     还有一些板子题也就一起放上来了

     1 //n个数是否能选出一些数使他们的和为k
     2 #include <cstdio>
     3 #include <iostream>
     4 #include <cstring>
     5 using namespace std;
     6 int n,k,a[100];
     7 bool vis[100],flag=0;
     8 void dfs(int x)
     9 {
    10     if (x==n+1)
    11     {
    12         int ans = 0;
    13         for (int i = 1;i <= n;i++)
    14         {
    15             if (vis[i])
    16             {
    17                 ans+=a[i];
    18             }
    19         }
    20         if (ans==k)
    21         flag=1;
    22         return;
    23     }
    24     vis[x] = 1;
    25     dfs(x+1);
    26     vis[x] = 0;
    27     dfs(x+1);
    28 }
    29 int main()
    30 {
    31     scanf ("%d%d",&n,&k);
    32     for (int i = 1;i <= n;i++)
    33     scanf ("%d",&a[i]);
    34     dfs(1);
    35     if (flag)
    36     printf ("Yes");
    37     else 
    38     printf ("No");
    39     return 0;
    40  } 
    //在n个数里面任选k个 ,求所有情况乘积的和
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    using namespace std;
    int n,k,a[100];
    bool vis[100];
    int tmp = 0;
    void dfs(int x,int count)
    {
        if (count==k)
        {
            int ans = 1;
            for (int i = 1;i <= n;i++)
            {
                if (vis[i])
                {
                    ans*=a[i];
                }
            }
            tmp+=ans;
            return ;
        }
        if (x==n+1)
        return ;
        vis[x] = 1;
        dfs(x+1,count+1);
        vis[x] = 0;
        dfs(x+1,count);
    }
    int main()
    {
        scanf ("%d%d",&n,&k);
        for (int i = 1;i <= n;i++)
        {
            scanf ("%d",&a[i]);
        }
        dfs(1,0);
        cout<<tmp;
        return 0;
     } 
  • 相关阅读:
    javaWeb之eclipse创建Servlet模板快捷键设置
    DBUtils-对JDBC简单封装的开源工具类库
    JDBC连接池(三)DBCP连接池
    JDBC连接池-C3P0连接
    JavaWeb中jsp九大内置对象 和四大作用域
    JDBC连接池-自定义连接池
    JavaWeb中jdbcproperties配置文件
    python学习之字典(Dictionary)练习
    用$.getJSON() 和$.post()获取第三方数据做页面 ——惠品折页面(1)
    请求转发与请求重定向的区别
  • 原文地址:https://www.cnblogs.com/very-beginning/p/11743184.html
Copyright © 2011-2022 走看看