zoukankan      html  css  js  c++  java
  • 回溯法

    1.回溯法编程求解0-1背包问题

    #include<stdio.h>

    #include<iostream>

    using namespace std;

    int c,n;

    int cv=0,cw=0,mv=0,mw=0;

    int weight[20],value[20];

    int x[20],bestv[20];

    int backtrack(int t)

    {

        int i;

        if(t>n)//回溯结束

        {

            if(cv>mv)

            {

               mv=cv;

               for(i=0;i<n;i++) bestv[i]=x[i];

            }

        }

        else

        {

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

            {

               x[t]=i;

               if(x[t]==0)

               {

                   backtrack(t+1);

                   x[t]=0;

               }

               else if((cw+weight[t]<=c)&&x[t]==1)

               {

                   cv=cv+value[t];

                   cw=cw+weight[t];

                   backtrack(t+1);

                   x[t]=0;

                   cv=cv-value[t];

                   cw=cw-weight[t];

               }

            }

        }

        return 0;

    }

    int main()

    {

        int i;

        cout<<"背包容量:";

        cin>>c;

        cout<<"物品个数:";

        cin>>n;

        cout<<"各物品重量:";

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

            cin>>weight[i];

        cout<<"各物品价值:";

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

            cin>>value[i];

        backtrack(0);

        printf("回溯法得出物品为");

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

            printf("%d  ",bestv[i]);

        cout<<endl<<"最大价值为:"<<endl<<mv;

        system("pause");

        return 0;

    }

    2.利用回溯法编程求解TSP问题

    #include<iostream>

    #include<algorithm>

    using  namespace std;

    int n;                          

    int a[100][100];        

    int x[100];                   

    int best [100]  = {0};     

    int bestp = 10000;             

    int thistp = 0;       

    //记录当前正在计算路径的费用

    void TSP(int t){

              if(t>n){

            if((a[x[n]][1])&&(a[x[n]][1]+thistp<bestp)){

                  bestp = a[x[n]][1]+ thistp;

                  for(int i = 1;i<=n;i++){

                     best [i] = x[i];

                  }

            }

         }else{

             for(int i = t;i<=n;i++){

                if((a[x[t-1]][x[i]])&&( thistp +a[x[t-1]][x[i]]<bestp)){

                    swap(x[t],x[i]);  

                    thistp +=a[x[t-1]][x[t]];

                    TSP(t+1);

                    thistp -=a[x[t-1]][x[t]];

                    swap(x[t],x[i]);

                }

             }

        }

    }

    int main(){

        cout<<"输入城市个数:"<<endl;

        cin>>n;    

        for(int i = 1;i<=n;i++){

             x[i] = i;

        }

        cout<<"输入城市之间的距离(0表示城市间不通):"<<endl;

        for(int i = 1;i<=n;i++){

            for(int j = 1;j<=n;j++){

                cin>>a[i][j];

            }

        }

        TSP(2);

        cout<<"最少旅行费用为: "<<bestp<<endl;

        cout<<"旅行路径为:"<<endl;

        for(int i = 1;i<=n;i++){

           cout<<best [i]<<" ";

        }

    cout<<best [1]<<endl;

    system("pause");

        return 0;

    }

  • 相关阅读:
    批处理命令系列
    CMD批处理之PC查看连过的WIFI密码
    数据结构与算法之各种方法遍历二叉树
    二叉树同构判定算法
    卡拉兹(Callatz)猜想
    Java之字符串比较大小
    Java报错之StackOverflowError
    火绒勒索病毒诱捕技术浅析
    数据结构与算法之二叉链树
    数据结构与算法之广义表的基本运算
  • 原文地址:https://www.cnblogs.com/wander-clouds/p/11037820.html
Copyright © 2011-2022 走看看