算法第四章作业

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过不了不知晓原因。

 

 

 

posted @ 2019-11-24 21:10  lycsuper  阅读(261)  评论(0)    收藏  举报