1.问题描述:一辆汽车加满油后可行驶nkm。旅途中有若干加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。
算法设计:对于给定的n和k个加油站位置,计算最少加油次数。
数据输入:n:表示汽车加满油后可行驶nkm
k:旅途中有k个加油站
k+1个整数:表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地。
数据输出:最少加油次数和具体在哪几个加油站加油。
例如: n=7 k=7
K+1个整数:1 2 3 4 5 1 6 6
最优值:4
2.相关代码:
#include<stdio.h>
#define M 100
int main(){
int stations[M];//八个间距
int ins; //油箱满的时候可以走的距离
int num;//中间加油站的数量
int i;
int all=0;//总的加油次数
int lv;//油箱中的油量可以走的距离
printf("请输入加油站的距离和数量\n");
scanf("%d%d",&ins,&num);
lv=ins;//油量赋初值
printf("请输入加油站间的距离\n");
for(i=0;i<num+1;i++){
scanf("%d",&stations[i]);
}
printf("加油站间的距离分别为:\n");
for(i=0;i<num+1;i++){
printf("%d ",stations[i]);
}
puts("");
for(i=0;i<num+1;i++){//如果油量可以支撑下一段路,则继续走
if(stations[i]>ins) {
printf("汽车不可能达到终点站");
return 0;
}
if(lv>=stations[i]){
lv-=stations[i];
}
else { //否则加满油
lv=ins-stations[i];
all++;
}
}
printf("需要加油的总的加油站数量\n");
printf("%d\n",all);//输出总的加油次数
}
3.问题分析与解题思路
如果要使用贪心算法解决问题,那么需要检查每一小段路程是否超过汽车满油量时的最大支撑路程。如果有超过的,那么汽车不可能走完这段路。否则,找到汽车满油量时的最大支撑路程范围内的最后一个加油站,加油后继续用此方法前进