回溯法

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;

}

posted @ 2019-06-17 08:53  夜游星  阅读(368)  评论(0编辑  收藏  举报