zoukankan      html  css  js  c++  java
  • DFS( 修改)

    例3:组合问题

    输出m个数中取n个数的所有组合。

    例如m=5,n=3的所有组合为:

    1      2      3

    1      2      4

    1      2      5

    1      3      4

    1      3      5

    1      4      5

    2      3      4

    2      3      5

    2      4      5

    3      4      5

    #include<iostream>

    using namespace std;

    int m,n,a[10];  //存放每个数

    void comb(int k)

    {  if ( k>n )

      {  for (int i=1; i<=n;i++)printf("%5d",a[i]);

      printf(" "); 

             }

      else

      for (int i=a[k-1]+1; i<=m-n+k; i++)

      {  a[k]=i; comb(k+1);         }

    }

    int main( ) 

    {  scanf("%d%d",&m,&n);

      comb(1);  //从第1个数开始

     }

    #include<iostream> using namespace std;

    int m,n,a[10];  //存放每个数

    void comb(int k)

    {     if ( k>n )

           {         for (int i=1; i<=n;i++)            cout<<a[i]<<" ";

                                cout<<endl; 

           }

        else

            for (int i=a[k-1]+1; i<=m-n+k; i++)

            {             a[k]=i;          comb(k+1);         }

    }

    int main( )

    {  

       cin>>m>>n;

        comb(1);  //从第1个数开始

    }

    例4:子集问题

               给定一个有n个元素的集合,输出它所有可能的子集(共2n个)。

    例如3个数1、2、3的所有子集为:

    空集

    1

    1      2

    1      3

    1   2      3

    2

    2   3

    3

     

    #include<iostream> using namespace std;

    int m,n,a[10];  //存放每个数

    void  DFS(int k)

      for (int i=0; i<k; i++)

         cout<<a[i]<<" ";

            cout<<endl;

           int min = k>a[k-1]+1 ? k : a[k-1]+1;

        for (int i=min; i<=m; i++) 

          {   a[k]=i;   DFS(k+1);     }

    } int main()

    {   cin>>m;

          //  for (int i=0; i<m; i++) a[i]=i+1;

        DFS(0);   return 0;  

      }

     
     
     
     
     
     

    // 子集问题   dfs代码1

    #include<iostream>

    using namespace std;

    int m,n,a[10];  //存放每个数

    void  DFS(int k)

    {   for (int i=0; i<k; i++)     cout<<a[i]<<" ";

            cout<<endl;  

        for (int i= a[k-1]+1; i<=n; i++)  

        {   a[k]=i;   DFS(k+1);     }

    }

    int main()

    {   cin>>n;   

        DFS(0);   return 0;   

    }

     **************************************************************************

    3

    0  0  0   ---------0

    0  0   ---------1                    3

    1  0   ---------2                    2

    1  1   ---------3                    2        3

    1  0  0   ---------4                    1

    1  0  ----------5                    1       3

    1  1  0   ---------6                    1        2

    1  1  1  ----------7                    1        2      3

    #include <iostream>
    using namespace std;
    int n,m, a[10];
    void  DFS(int k)
    {   if  (k>n) 
        {  for (int i=1; i<=n; i++)     
              
              cout<<a[i]<<" ";
           cout<<endl;   
        }
        else 
           for (int i=0; i<=1; i++)   
           {    a[k]=i;    DFS(k+1);      }
    }
    int main()
    {        cin>>n;         DFS(1);    return 0;       }
    View Code


    #include <iostream>
    using namespace std;
    int n,m, a[10];
    void  DFS(int k)
    {   if  (k>n)
        {  for (int i=1; i<=n; i++)    
          
           cout<<a[i]<<" ";
           cout<<endl;  
        }
        else
           for (int i=0; i<=1; i++)  
           {    a[k]=i;    DFS(k+1);      }
    }
    int main()
    {        cin>>n;         DFS(1);    return 0;       }

    ********************************************************************************************************************

    ***************************************************************************************************************************

    #include <iostream>
    using namespace std;
    int n,m, a[10];
    void  DFS(int k)
    {   if  (k==n)
        {  for (int i=0; i<n; i++)    
           if (a[i]==1) cout<<i+1<<" ";
           cout<<endl;  
        }
        else
           for (int i=1; i<=2; i++)  
           {    a[k]=i;    DFS(k+1);      }
    }
    int main()
    {        cin>>n;         DFS(0);    return 0;       }

     

     
    #include <iostream>
    using namespace std;
    int n,m, a[10];
    void  DFS(int k)
    {   if  (k==n)
        {  for (int i=0; i<n; i++)    
           if (a[i]==0) cout<<i+1<<" ";
           cout<<endl;  
        }
        else
           for (int i=0; i<=1; i++)  
           {    a[k]=i;    DFS(k+1);      }
    }
    int main()
    {        cin>>n;         DFS(0);    return 0;       }

     // 子集问题   dfs代码2
    #include <iostream>
    using namespace std;
    int n,m, a[10];
    void  DFS(int k)
    {   if  (k==n)
        {  for (int i=0; i<n; i++)    
           if (a[i]==1) cout<<i+1<<" ";
           cout<<endl;  
        }
        else
           for (int i=0; i<=1; i++)  
           {    a[k]=i;    DFS(k+1);      }
    }
    int main()
    {        cin>>n;         DFS(0);    return 0;       }


     

    ******************************************************************************************************************************************

    #include <iostream>
    using namespace std;
    int n;
    int main()
    {   int i,j;
        cin>>n;
        for (i=0; i<(1<<n); i++)
        {
         for (j=0;j<n;j++)
               if ( i&(1<<j)) cout<<j<<" ";
            cout<<endl;
        }
        return 0;
    }

    // 子集问题   二进制转换法

    #include <iostream>

    using namespace std;

    int n;

    int main()

    {   int i,j;

        cin>>n;

        for (i=0; i<(1<<n); i++)

        {

          for (j=0;j<n;j++)

                if ( i & (1<<j)  )      cout<<j+1<<" ";

            cout<<endl;

        }

        return 0;

    }

  • 相关阅读:
    MKMapVIew学习系列2 在地图上绘制出你运行的轨迹
    WPF SDK研究 Intro(6) WordGame1
    WPF SDK研究 Intro(3) QuickStart3
    WPF SDK研究 Layout(1) Grid
    WPF SDK研究 目录 前言
    WPF SDK研究 Intro(7) WordGame2
    WPF SDK研究 Layout(2) GridComplex
    对vs2005创建的WPF模板分析
    WPF SDK研究 Intro(4) QuickStart4
    《Programming WPF》翻译 第6章 资源
  • 原文地址:https://www.cnblogs.com/2014acm/p/3891705.html
Copyright © 2011-2022 走看看