算法第四章作业
1.对贪心算法的理解
贪心算法的核心是:不考虑全局最优解,只专注于选择当前最优解,当所有的局部最优解选完时,就会神奇的发现全局最优解就是局部最优解的总和。就像我们学习一样,就是一种贪心算法。每天学习一天中能学到的最多的东西(局部最优解),到期末的时候就不怕挂科从而达到全局最优解。
但贪心算法并不适用与所有的问题,比如0-1背包问题。
若要证明贪心算法的正确性,则要证该问题具有贪心选择性质,且符合最优子结构性质。要推翻贪心策略更简单,只需要举出一个反例即可。
2.汽车加油问题的贪心选择性质(类似背包问题)
7-1 汽车加油问题 (15 分)
题目来源:王晓东《算法设计与分析》
一辆汽车加满油后可行驶 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 void greedy(int n, int k, int dis[]){ 5 int run = n; 6 int oil = 0; 7 for(int i = 1; i <= k + 1; i++){ 8 if(dis[i] > n){ 9 cout << "No Solution!"; 10 return; 11 } 12 } 13 for(int j = 1; j <= k + 1; j++){ 14 run-=dis[j]; 15 if(run < 0){ 16 oil ++; 17 run = n - dis[j]; 18 } 19 } 20 cout << oil; 21 } 22 int main(){ 23 int n; 24 cin >> n; 25 int k; 26 cin >> k; 27 int dis[k + 2]; 28 for(int i = 1; i <= k + 1; i++){ 29 cin >> dis[i]; 30 } 31 greedy(n, k,dis); 32 return 0; 33 }
贪心策略:汽车从起点一直开下去,直到汽车油量小于0,加油,刷新油量(注意油量的赋值)
说明贪心选择性质
汽车从起点出发,根据第一个距离确定是否需要加油,若剩下的油量满足下一个距离, 则不加油,否则加满油。其中,欸一次加油都是一次贪心选择。加满油后,剩下的距离,就成为了原问题的子问题,从而到终点就可以得到全局最优解。故该问题具有贪心选择。
本章学习过程中遇到的问题及结对编程的情况
结对编程情况正常,会场安排问题使用扫描法PTA过不了不知晓原因。

浙公网安备 33010602011771号