算法分析与设计实验报告——实现汽车加油问题
目录:
一、 实验目的
掌握贪心算法的基本思想和解决问题的基本步骤,认识贪心算法和动态规划的联系与区别,对比解决同一问题的两种算法设计策略的时间复杂性。
二、实验要求
用c++语言实现用贪心算法解决汽车加油问题,分析时间复杂性,体会贪心算法解决问题的基本思路和步骤。
三、 实验原理
利用贪心算法每次使加油前行驶距离最大,一旦剩余油量不够行驶下一个加油站,就将油加满,从而最终到达目的地。先检测各加油站之间的距离,若发现其中有一个距离大于汽车加满油能跑的距离,则输出no solution
否则,对加油站间的距离进行逐个扫描,并且累加记录距离,尽量选择往远处走,不能走了,即当累加距离大于n时,就加油一次(sum++),最终统计出来的sum便是最少的加油站数
四、 实验过程(步骤)
见附件一
实验步骤、特点
重要源代码(流操作的部分要醒目的提示并注释)
五、 运行结果
见附件二
六、实验分析与讨论
这次试验的贪心算法比较简单,编程比较容易实现。应该注意的点就是需要首先判断有没有超过汽车行驶距离的加油站距离。
七、实验特色与心得
在贪心算法中,每次做出的选择仅在当前的状态下做出的最好的选择,即局部最优选择。然后再去解做出这个选择后产生的相应的子问题。不是每个问题用贪心算法都可以一定得到最优解,除非该问题具有贪心选择性质(所求问题的整体最优解可以通过一系列局部最优的选择而得到)和最优子结构性质。
附件一 实验过程(步骤)
#include <bits/stdc++.h>
using namespace std;
//计算最小加油次数,加油站数组,最远能跑多远
int MinimumRefuelingTimes(vector<int> x, int n) {
//次数总和
int sum = 0;
//加油站个数
int klen = x.size();
//判断有没有加油站之间的距离超过汽车所能行驶的最远距离
for (int i = 0; i < klen; i++) {
if (x[i] > n) {
cout << "No Solution" << endl;
return 0;
}
}
//进行次数查找
int s = 0;
for (int i = 0; i < klen; i++) {
s += x[i];
if (s > n) {
sum++;
s = x[i];
}
}
return sum;
}
int main() {
vector<int> GasStation;
int n, k, len;
cout << "请输入汽车加满油后可以行驶的里程数:n=";
cin >> n;
cout << "请输入旅途中的加油站数量:k=";
cin >> k;
cout << "请依次输入相邻加油站之间的距离:";
for (int i = 0; i <= k; i++) {
cin >> len;
GasStation.push_back(len);
}
int mintimes = MinimumRefuelingTimes(GasStation, n);
if (mintimes)
cout << "最少加油次数为:" << mintimes << endl;
return 0;
}