算法第四章作业
一、我对贪心算法的理解
1、思想
当一个问题具有最优子结构性质时,可用动态规划求解,有时用贪心算法会更简单。贪心算法总是做出在当前看来是最好的选择。也就是说,贪心算法并不从整体最优上加以考虑,所做的选择只是在某种意义上的局部最优选择。
虽然贪心算法不是对所有问题都能得到整体最优解,但对范围相当广的问题能产生整体最优解,如最小生成树问题、图的单源最短路径问题等。
2、特点
- 贪心算法的每一步都有一组选择,总是作出在当前来看是最好的选择。
- 就是说,贪心算法并不从整体最优上来考虑,所作出的选择只是某种意义上的局部最优选择。
- 希望通过作出局部最优选择达到全局最优。可是贪心算法并不能保证最终结果是最优的。
- 贪心算法是否能导致全局最优,需证明。
3、产生全局最优解的条件
- 贪心选择性质:全局最优解可通过局部最优选择得到
- 最优子结构性质
4、一般框架

二、说明汽车加油问题的贪心选择性质
汽车加油问题:
题目来源:王晓东《算法设计与分析》
一辆汽车加满油后可行驶 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
1 #include<iostream> 2 using namespace std; 3 4 int Find(int *a, int n, int k){ 5 int oil = n; 6 int count = 0; 7 for(int i=1; i<=k+1; i++){ 8 if(a[i] > n){ 9 cout << "No Solution!" << endl; 10 return 0; 11 } 12 13 if(oil >= a[i]){ 14 oil -= a[i]; 15 } 16 else{ 17 oil = n; 18 oil -= a[i]; 19 count++; 20 } 21 } 22 cout << count << endl; 23 return 0; 24 } 25 int main(){ 26 int n, k; 27 cin >> n >> k; 28 int a[1002]; 29 for(int i=1; i<=k+1; i++){ 30 cin >> a[i]; 31 } 32 Find(a, n, k); 33 return 0; 34 }
贪心选择性质:汽车在一开始加满油后,每到一个站就进行一次判断,如果油足够抵达下一站,则继续行驶,否则加满油,如果即使加满油也无法到达下一站,则无法到达目的地。
三、在本章学习过程中遇到的问题及结对编程的情况
1、问题
对于贪心算法,我很难能想出怎样才是当前的最好选择,而且对于在实际做题中区分是使用动态规划还是贪心算法,仍然有些迷糊。
2、结对编程
完成任务越来越顺利,可以互相找出错误,弥补对方的不足。

浙公网安备 33010602011771号