一、基本思想
贪心算法的基本思想是找出整体当中每个小的局部的最优解,并且将所有的这些局部最优解合起来形成整体上的一个最优解。局部的最优解往往是近似最优解;因此贪心法求解时需要“目光短浅”。
二、汽车加油问题
一辆汽车加满油后可行驶n公里,旅途中有k个加油站。求解如下问题:汽车应在哪些加油站停靠加油,使沿途加油次数最少。
三、算法分析
用贪心法求汽车加油问题,唯一的度量标准就是我们加满油后已经走过的路程与即将所走的一段路程之和是否超过汽车的最大行驶路程,如果超过,则在该加油站加油,反之则出发。贪心法所得出的结论是局部最优解,也是全局最优解,可以求出汽车的最小加油次数。
for (int i = 0; i <= k; i++){
road += a[i];//已经走的路程与即将要走的路程相加
if (road > n){//若结果超过汽车的最大限度
count++;//需要加油
road = a[i];//油箱加满油
cout << i << " ";//输出加油的加油站
}
}
四、代码实现
#include <iostream>
using namespace std;
const int maxn = 100;
int a[maxn];//加油站之间的距离
int n, k;
int found(int a[]){
int count = 0;
int road = 0;
for (int i = 0; i <= k; i++){
if (a[i] > n){//如果两个加油站的距离大于汽车加满油所要行驶的最大距离,则无法抵达
cout << "地点不可及" << endl;
return -1;
}
}
cout << "需要加油的的加油站为:" ;
for (int i = 0; i <= k; i++){
road += a[i];//已经走的路程与即将要走的路程相加
if (road > n){//若结果超过汽车的最大限度
count++;//需要加油
road = a[i];//油箱加满油
cout << i << " ";//输出加油的加油站
}
}
cout << endl;
return count;
}
int main()
{
cout << "请输入汽车满油可行驶的距离和旅途中加油站的个数:" << endl;
cin >> n >> k;
cout << "请依次输入各个加油站之间的距离:" << endl;
for (int i = 0; i <= k; i++)
cin >> a[i];
int count = found(a);
if (count >= 0)
cout << "最少加油次数为:" << count << endl;
return 0;
}