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);
    }

  • 相关阅读:
    css设置兼容的透明样式
    mybatis 使用oracle merge into 语句踩坑实录
    eclipse导入SVN上的Maven多模块项目
    jquery.form插件中动态修改表单数据
    java的几种对象(po,dto,dao等)
    redis面试总结
    前段面试准备
    查询各科成绩最好的学生
    Github访问慢解决办法
    该文件有程序在使用
  • 原文地址:https://www.cnblogs.com/gaoxiangde/p/4379895.html
Copyright © 2011-2022 走看看