当前位置:文档之家› 货郎担问题或旅行商问题动态规划算法

货郎担问题或旅行商问题动态规划算法

#include <stdio.h>
#include <stdlib.h>
#define maxsize 20
int n;
int cost[maxsize][maxsize];
int visit[maxsize]={1}; //表示城市0已经被加入访问的城市之中
int start = 0; //从城市0开始
int imin(int num, int cur)
{
int i;
if(num==1) //递归调用的出口
return cost[cur][start]; //所有节点的最后一个节点,最后返回最后一个节点到起点的路径
int mincost = 10000;
for(i=0; i<n; i++)
{
//printf("%d-------%d\n",i,visit[i]);
if(visit[i]==0 && i!=start) //该结点没加入且非起始点
{
/*if(mincost <= cost[cur][i]+cost[i][start])
{
continue; //其作用为结束本次循环。

即跳出循环体中下面尚未执行的语句。

区别于break
} */
visit[i] = 1; //递归调用时,防止重复调用
int value = cost[cur][i] + imin(num-1, i);
if(mincost > value)
{
mincost = value;
}
visit[i] = 0;//本次递归调用完毕,让下次递归调用
}
}
return mincost;
}
int main()
{
int i,j;
// int k,e,w;
n=4;
int cc[4][4]={{0,10,15,20},
{5,0,9,10},
{6,13,0,12},
{8,8,9,0}};
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
cost[i][j]=cc[i][j];
}
}
imin(n,start);
printf("把每个城市访问一次并返回原点最小费用%d\n",imin(n,start));
return 0;
}。

相关主题