动态规划

利用动态规划算法编程求解TSP问题

 

#include<stdio.h>

#include<iostream>

#include<cmath>

using  namespace std;

#define INF 9000

int mp[20][20];

int n;

int dp[20][1<<20];

int mark[20][1<<20];

int min(int a, int b)

{

    return (a<b ? a : b);

}

int TSP()

{

    int s=(1<<(n-1));

    dp[0][0]=0;

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

    {

       dp[i][0]=mp[i][0];

    }

    dp[0][(s-1)]=INF;

 

    for(int j=1;j<(s-1);j++)

    {

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

       {

           if((j&(1<<(i-1)))==0)

           {

              int m=INF;

              for(int k=1;k<n;k++)

              {

                  if((j&(1<<(k-1)))>0)

                  {

                     int tmp=dp[k][(j-(1<<(k-1)))]+mp[i][k];

                     if(m>tmp)

                     {

                         m=tmp;

                         mark[i][j]=k;

                     }

                  }

              }

              dp[i][j]=m;

           }

        }

    }

    int m=dp[0][s-1];

    for(int k=1;k<n;k++)

    {     

       int tmp=mp[0][k]+dp[k][(s-1)-(1<<(k-1))];

       if(m>tmp)

       {

           m=tmp;

           mark[0][s-1]=k;

       }

    }

    dp[0][s-1]=m;

    printf("最短路径为");

    int ss=s-1;

    int ff=0;

    for(int i=0;i<n-2;i++)

    {

       cout<<"-->"<<mark[ff][ss];

       ff=mark[ff][ss];

       int fff=1<<(ff-1);

       ss=fff^ss;

    }

    int sss;

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

    {

       if(1<<i==ss)

       {

           sss=i+1;

           break;

       }

    }

    cout<<"-->"<<sss<<"-->0";

    return dp[0][s-1];

}

int main()

{

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

    cin>>n;

       int ss=(1<<(n-1));

       cout<<"请输入代价矩阵:"<<endl;

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

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

              cin>>mp[i][j];

       cout<<endl<<"最短路径长度为:"<<TSP()<<endl;

    system("pause");

    return 0;

}

 

100 3 6 7

5 100 2 3

6 4 100 2

3 7 5 100

 

2.利用动态规划算法编程求解0-1背包问题

#include<stdio.h>

#include<iostream>

#include<iomanip>

#include<cmath>

using  namespace std;

int x[100], V[100][100];

 int max(int a, int b)

 {

     return (a>b ? a : b);

 }

 int KnapSack(int n,int C,int w[], int v[])

 {

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

        V[i][0]=0;

     for(int j=0; j<=C; j++)

        V[0][j]=0;

    //填表过程

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

        for(int j=1; j<=C ; j++)

            if(j<w[i])

              V[i][j]=V[i-1][j];

            else

              V[i][j]=max(V[i-1][j], V[i-1][j-w[i]]+v[i]);

           int j=C; //求装入背包的物品

    for(int i=n; i>0; i--)

    {

        if(V[i][j]>V[i-1][j])

        {

            x[i]=1;

            j=j-w[i];

        }

        else x[i]=0;

    }

    return V[n][C];//最大价值

 }

int main()

{

    //n是物品个数;C是背包总容量

    int w[100], v[100], n, C;

    cout<<"请输入物品种类:";

    cin>>n;

    cout<<"请输入背包重量:";

    cin>>C;

    cout<<"请输入重量矩阵:";

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

        cin>>w[i];//这里注意i从1开始取值

    cout<<"请输入价值矩阵:";

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

       cin>>v[j];//这里注意j从1开始取值

    cout<<endl;

    cout<<"背包取得的最大价值为:"<<KnapSack(n,C,w,v)<<endl;

    cout<<"问题的最优解序列为:";

    for(int s=1; s<=n; s++)

        cout<<x[s];

    cout<<endl;

    cout<<"二维矩阵V为:"<<endl;

    for(int p=0; p<=n; p++)

    {

        for(int q=0; q<=C; q++)

            cout<<setw(6)<<V[p][q];

       cout<<endl;

    }

    system("pause");

    return 0;

}

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