zoukankan      html  css  js  c++  java
  • 回溯法——关于子集树和排列树

    当所给问题是从n个元素的集合S中找出满足某种性质的子集时,解空间为子集树例如:0-1背包问题 

    当所给问题是从n个元素的集合S中找出满足某种性质的排列时,解空间为排列树例如:旅行售货员问题

     

     回溯法搜索子集树算法描述为:

    void backtrack(int  t)

    {
         if(t>n)   
            output(x);
         else
            for(int i=0; i<=1; i++)
          {  
                 x[t] = i; 
                 if(constraint(t) && bound(t))     
                      backtrack(t+1);
           }  
    }
         回溯法搜索排列树的描述为:

         void backtrack(int  t)

        {
           if(t>n)  

               output(x);
           else      

              for(int i=t; i<=n; i++)
              {
                swap(x[t], x[i]);
                if(constraint(t) && bound(t))      backtrack(t+1);
                swap(x[t], x[i]);       

             }     

       }


    具体实例:

    /*-------遍历子集树------*/


    #include<stdio.h>
    #include<string.h>
    #define N 3
    int x[N+1];
    void Backtrace(int t)
    {
        if(t>N)
        {
            for(int i=1;i<=N;i++)
            {
                printf("%d ",x[i]);
            }
            printf(" ");
        }
        else
        {
            for(int i=0;i<=1;i++)
            {
                x[t]=i;
                Backtrace(t+1);
            }
        }
    }
    int main()
    {
        memset(x,0,(N+1)*sizeof(int));
        Backtrace(1);
    }
    -----------------------------------------------------------------------------------------------------------------------------------
    /*--------遍历排列树-------------*/


    #include<stdio.h>
    #include<string.h>
    #define N 3
    int x[N+1]={0,1,2,3};
    void swap(int &a,int &b)
    {
        int temp=a;
        a=b;
        b=temp;
    }
    void Backtrace(int t)
    {
        if(t>N)
        {
            for(int i=1;i<=N;i++)
            {
                printf("%d ",x[i]);
            }
            printf(" ");
        }
        else
        {
            for(int i=t;i<=N;i++)
            {
                swap(x[t],x[i]);
                Backtrace(t+1);
                swap(x[t],x[i]);
            }
        }
    }
    int main()
    {
        Backtrace(1);
    }

  • 相关阅读:
    dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算
    gdb 调试
    chrome 浏览器命令
    Can't locate Switch.pm in @INC
    Git 图解剖析
    Android STL PORT
    Git 使用及原理 总结
    ndk-gdb 对java/native code联合调试(升级版)
    [转载] 关关采集不能生成html的问题
    TortoiseGit文件夹和文件图标不显示解决方法
  • 原文地址:https://www.cnblogs.com/gaoxiangde/p/4379895.html
Copyright © 2011-2022 走看看