zoukankan      html  css  js  c++  java
  • 动态规划

    利用动态规划算法编程求解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;

    }

  • 相关阅读:
    div3--C. Pipes
    Problem F Free Weights
    H
    Problem C Careful Ascent
    Problem L. World Cup
    Problem E. Bet
    Problem D. Ice Cream Tower
    A. Number Theory Problem
    A
    软考知识点梳理--项目评估
  • 原文地址:https://www.cnblogs.com/wander-clouds/p/11037804.html
Copyright © 2011-2022 走看看