货郎问题的实例 c语言编程,货郎担问题的C语言解法

这是运筹学的货郎担问题的C语言解法。有菜单的。。

#define N 5

#include

#include

int d[N][N];

int Way[N];

void Sort(int a[],int low,int up)//排序

{

int i,j,k,t;

for(i=low+1;i<=up;i++)

for(j=low;j

if(a[j]>a[i])

{

t=a[i];

for(k=i;k>j;k--) a[k]=a[k-1];

a[j]=t;

break;

}

}

int Work(int a[],int n,int b)//解决问题

{

int i,j,k,t,cost,min;

cost=0;min=0;

long s,count;

Sort(a,0,n-1);

min+=d[b][a[0]];

for(i=0;i

min+=d[a[i]][b];

for(i=0;i

s=1;

for(i=1;i<=n;i++) s=s*i;

for(count=2;count<=s;count++)

{

j=n-1;

while(a[j-1]>a[j]) j--;

k=j; a[k]=a[j];

for(i=j+1;i

if(a[k]>a[i]&&a[i]>a[j-1])

{k=i;a[k]=a[i];}

t=a[k];a[k]=a[j-1];a[j-1]=t;

Sort(a,j,n-1);

cost+=d[b][a[0]];

for(i=0;i

cost+=d[a[i]][b];

if(cost

{

min=cost;

for(i=0;i

}

cost=0;

}

return min;

}

void main()//主函数

{

int a,n=N,s,i,j,v[N],k;

while(1)

{

printf(" =================货郎担问题的穷举解法=================\n\n\n");

printf(" 1 ---------------输入数据---------------\n");

printf(" 2 ---------------输出原始数据---------------\n");

printf(" 3 ---------------解决问题---------------\n");

printf(" 4 ---------------输出最终结果---------------\n");

printf(" 0 ---------------退出系统---------------\n\n");

printf("请选择相应序号:");

scanf("%d",&k);

printf("\n");

switch(k)

{

case 1:

{

for(i=0;i

v[i]=i;

printf("请输入出发村庄的编号(从1——%d)",n);

scanf("%d",&a);

a=a-1;

getchar();

for(i=a;i

v[i]=v[i+1];

printf("\n请输入各个城市之间的距离数据:(共有 %d 个城市,%d 个数据)\n",n,n*n);

for(i=0;i

for(j=0;j

{

scanf("%d",&d[i][j]);

}

printf("输入完毕!\n");

system("pause");

system("cls");break;

}

case 2:

{

printf("输入各个村庄的距离如下:\n");

for(i=0;i

{

for(j=0;j

printf("%3d",d[i][j]);

printf("\n");

}

system("pause");

system("cls");break;

}

case 3:

{

s=Work(v,n-1,a);

printf("问题解决完毕!\n");

system("pause");

system("cls");

break;

}

case 4:

{

printf("最短路径为\n%d ",a+1);

for(i=0;i

printf("%d\n",a+1);

printf("最小值为 %d\n",s);

system("pause");

system("cls");break;

}

case 0:

{

printf("\n谢谢使用!\n");

exit(0);break;

}

default:{

printf("对不起,您的输入有误。。。。\n");

system("pause");

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值