有N辆车要按顺序通过一个单向的小桥,由于小桥太窄,不能有两辆车并排通过,因此在桥上不能超车,另外,由于小桥建造的时间已经很久,只能承受有限的重量,记为Max(吨),即任意时刻在桥上行驶的总重量不能超过Max(吨)。因此车辆在过桥的时候必须要有控制,需将这N辆车按初始的顺序分组,每次让一个组过桥,并且只有在一个组中所有的车辆全部过桥后才让下一组车辆上桥。现已知每辆车的重量和最大速度,而每组车的过桥时间由该组中速度最慢的那辆车决定。现请设计程序,将这N辆车分组,使得全部车辆通过的时间最短。设某座桥长100m,最大承重量为100t,当有10辆车通过时的计算结果如下表所示。(本题涉及到库函数memset)
输入 输出
40 25
50 20
50 20
70 10
12 50
9 70
49 30
38 25
27 50
19 70 75.0
这是问题。我写了一个程序,但是运行不了。估计就是从开始求最优解那块有错误。
希望厉害的大牛给我点帮助,代码有注释。 谢谢大家.
#include<stdlib.h>
#include<string.h>
int main()
{
int w[]={40,50,50,70,12,9,49,38,27,19};
float v[]={25,20,20,10,50,70,30,25,50,70};
int i,j,k;
float minspeed,maxweight=100,length=100,time=0,mintime,emintime=0;
int **weight,**speed;
//申请一个10*10的二维数组 关于重量的,weight[a][b]表示从第a辆车到第b辆车过桥时的重量
weight=(int **)malloc(10*sizeof(int *));
for(i=0;i<10;i++)
weight[i]=(int*)malloc(sizeof(int)*10);
//申请一个10*10的二维数组 关于速度的,speed[a][b]表示从第a辆车到第b辆车过桥时的速度
speed=(int **)malloc(10*sizeof(int *));
for(i=0;i<10;i++)
speed[i]=(int*)malloc(sizeof(int)*10);
//初始化这两张表,将其值全部设置为0
memset(weight, 0, sizeof(weight));
memset(speed, 0, sizeof(speed));
//给重量表赋值
for(i=0;i<10;i++)
for(j=i;j<10;j++)
weight[i][j]+=w[j];
//速度表赋值
for(i=0;i<10;i++)
for(j=i;j<10;j++)
{
if(weight[i][j]>maxweight) //重量大于100的直接将速度设置为0
{
speed[i][j]=0;
continue;
}
minspeed=v[i]; //找出每个组的最小速度
for(k=i;k<=j;k++)
if(minspeed>v[k])
minspeed=v[k];
}
//开始寻找最优解
for(i=0;i<10;i++)
{
for(j=i;j<10;j++)
{
if(speed[i][j]!=0)
{
time=length/speed[i][j];
mintime=length/speed[i+1][j+1];
for(k=j+2;k<10;k++)
if(speed[k-1][k]!=0&&mintime>length/speed[k-1][k])
{
mintime=length/speed[k-1][k];
time=time+mintime;
}
}
else
continue;
}
if(emintime==0)
emintime=mintime;
if(emintime>mintime)
emintime=mintime;
}
printf("%f",emintime);
return 0;
}