算法第四章作业
一、贪心算法的理解
目前对贪心算法的理解就是几个“最”字,在对问题求解时,往往寻找它的最优解,并不是整体的最优解,而是局部的最优解,总是从目前来看是最优的选择。
而验证是否为最优解的同时,可以用反证法证明目前是否为最优解情况,若不是则继续寻找最优解的情况。
贪心算法往往寻找的不是整体的最优解,是选择每一步的最优解,累积起来,结果不等于最优解但接近于最优解。
二、汽车加油问题
题目来源:王晓东《算法设计与分析》
一辆汽车加满油后可行驶 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
运行代码:
#include<iostream> using namespace std; int main(){ int n,k; int a[1000]; int count = 0; cin>>n>>k; for(int i = 0;i <= k;i++){ cin>>a[i]; } int temp = n; for(int i = 0;i <= k;){ if(a[i]<=n) { if(temp >= a[i]){ temp = temp -a[i]; i++; } else { count++; temp = n; } } else { cout<<"No Solution!"<<endl; return 0; } } cout<<count<<endl; return 0; }
贪心策略:每一次都尽可能的使油量发挥到最大,行驶更远的距离,用变量team来记录剩余油,在下一加油站满足距离小于满油量时能够到达的最远路径,每一次行驶前判断剩余油量team是否能够到达下一个加油站,如果能则到达下一加油站,如果不能则加满油量,再行使至下一加油站。如果距离大于满油量能够达到的最远路径,则输出“No Solution!”。
三、总结体会
贪心算法就动态规划来说简单了许多,只需要考虑每一步最优的情况,并实现便能很快的解决问题,自己能够想出解决办法,并且实现代码,可以让自己对于贪心的理解更加深入,只需要多做一些题目,便能对贪心更好的掌握,结对编程时,对于同一个问题总能有不同的想法,互相交流时可以提高自己的思维方式,从另一方面考虑问题也能实现同一个问题的答案,每一次结对编程都能够有所收获并且期待着下一次的结对编程。