一、实验目的
1、理解并掌握贪心算法,学会运用贪心算法解决问题。
2、掌握贪心算法的基本要素:最优子结构性质和贪心选择性。
二、问题描述
一辆汽车加满油后可以行驶nkm。旅途中有若干个加油站。设计一个有效算法,指出应在那些加油站停靠加油, 使沿途的加油次数最少。并证明算法能产生一个最优解。
对于给定的n和k个加油站位置,计算最少加油次数。
数据输入:第一行有2个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1行中,有k+1 个整数,表示第k个加油站与第k-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已加满油。第k+1 个加油站表示目的地。
结果输出:输出编程计算出的最少加油次数。如果无法到达目的地,则输出”NoSolution”。
三、问题分析
该问题运用贪心算法计算最小加油次数。将问题分为以下几种情况考虑:
(1)始点与终点的距离不超过nkm,则不需要加油。输出0。
(2)始点与终点的距离超过nkm,且每两个加油站之间的距离不超过nkm,则可以达到目的地。
(3)某两个加油站之间的距离大于nkm,则无法达到目的地,输出“No Solution”。
实现:在每一个加油站出发前先做出判断,判断到下一个加油站的路程是否大于nkm,若大于则直接输出“No Solution”的不可达信息。否则再判断当前汽车中的油能否支持汽车到达下一加油站,若能支持则继续出发,不能则加油。
#include <iostream>
using namespace std;
int main()
{
int n,k,num=0;
cin>>n>>k;//输入加满油可行驶的路程和加油站个数
int m=n;
int a[k+1];
for(int i=0;i<k+1;i++)
cin>>a[i];//输入加油站之间的距离
for(inti=0;i<k+1;i++)
{
//判断是否能达到目的地
if(n<a[i])
{
cout<<"No Solution";
return 0;
}
//判断剩余的油是否足够到达下一站
elseif(m>=a[i])
m-=a[i];
else
{
//加油
m=n;
num++;
i--;
}
}
cout<<num;
return0;
}