算法第四章作业

一、我对贪心算法的理解

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、结对编程

完成任务越来越顺利,可以互相找出错误,弥补对方的不足。

posted @ 2019-11-23 14:14  WWYlaowu  阅读(176)  评论(0)    收藏  举报