1 对贪心算法的理解:贪心算法是一种总是做出在当前看来是最好选择的算法。它并不从整体最优上加以考虑,所作出的选择只是在某种意义上的局部最优选择。但是在某些情况下,贪心选择也是可以得到整体最优解的(找硬币问题),其他的情况虽然不能得到整体最优解,但是得到的也是最优解的近似解。
2 说明汽车加油问题的贪心选择性质
问题:一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少。
输入:第一行有 2 个正整数n和 k(k<=1000 ),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。 第二行有 k+1 个整数,表示第 k 个加油站与第 k-1 个加油站之间的距离。 第 0 个加油站表示出发地,汽车已加满油。 第 k+1 个加油站表示目的地。
输出:输出最少加油次数。如果无法到达目的地,则输出“No Solution!”。
样例:
7 7 1 2 3 4 5 1 6 6
4
代码:
for (int i = 0; i <= m; i++) {
if (a[i] > n) {
cout << "No Solution!" << endl;
return 0;
}
}
sum = 0;
count = 0;
for(int i = 0; i <= m; i++){
sum += a[i];
if (sum > n) {
count++;
sum = a[i];
}
}
cout << count << endl;
算法:要想加油次数最少,就要计算自己当前所走的距离和下一个加油站的距离和,如果距离和大于加一次油能走的最大距离,那就要停下来加一次油。如果两个加油站之间的距离大于加一次油可以走的最大距离,那么就是无法到达的。
3 在本章学习过程中遇到的问题及结对编程的情况:遇到的问题应该就是不太会用贪心算法(例如会场排序,不知道该按开始时间排还是结束时间排)。结对编程,我们现在线下的讨论也比较多了,有较多的沟通交流。