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