贪心算法-汽车加油
一辆汽车加满油后可行驶n千米。旅途中有若干个加油站。若要使沿途加油次数最少,设计一个有效算法,指出应在哪些加油站停靠。
算法解答:
(使用的是回溯的方法,
用数组存储各加油站之间的距离,
然后按照贪心算法进行试算,如果不行,则回溯。
举个例子吧:如果可以行驶20公里,第一个加油站离起点10公里,如果第二个离第一个加油站18公里,那么就不应该在第一个加油,如果第二个加油站里第一个加油站只有8公里,那么自然可以到第二个加油,就这样一个一个的往后试,如果不行,就回溯,这样就可以了。)
程序:
// 汽车加油.cpp : Defines the entry
point for the console application.
//
#include "stdafx.h"
int main(int argc, char*
argv[])
{
int
OilStationNum;//加油站的数目
int
MaxDist; //汽车加满油以后行驶的最大距离
int
DiscOfCar; //汽车一次加油后已经行驶的距离
int Count;
int * OilStationDist;
printf("请输入加油站的段数(用整数表示):");
scanf("%d",&OilStationNum);
printf("------------------------------\n");
printf("汽车加满油以后行驶的最大距离(用整数表示):");
scanf("%d",&MaxDist);
printf("---------------------------------------\n");
OilStationDist=new int
[OilStationNum-1];
printf("请输入各各加油站之间的距离(假设不能有环路):\n");
for
(Count=0;Count<=OilStationNum-1;)
{
//
scanf("%d",&OilStationDist[Count]);
if
(OilStationDist[Count]<=MaxDist)
Count++;
else
printf("你输入的加油站之间的距离大于汽车加满油以后行驶的最大距离,请重新输入当前距离!\n");
}
printf("-----------------------------------------\n");
printf("下面是你输入的加油站之间的顺序间隔:\n");
for
(Count=0;Count<=OilStationNum-2;Count++)
{
//
printf("加油站编号:%d,到下一站距离:%d\n",Count,OilStationDist[Count]);
}
printf("加油站编号:%d,到终点站距离:%d\n",OilStationNum-1,OilStationDist[OilStationNum-1]);
DiscOfCar=0;
Count=0;
while (1)
{
if
(DiscOfCar<=MaxDist)
{
//
DiscOfCar+=OilStationDist[Count];
Count+=1;
}
else
{
//
Count-=1;
printf("当前汽车需要在%d号加油站处加油,此时汽车行驶了%d公里\n",Count,DiscOfCar-OilStationDist[Count]);
DiscOfCar=0;
}
if
(Count>OilStationNum)
{
printf("当前汽车到达终点,此时汽车距上一次加油行驶了%d公里\n",DiscOfCar-OilStationDist[Count]);
}
if
(Count>OilStationNum) break;
}
return 0;
}