算法第四章作业

一、贪心算法的理解

  目前对贪心算法的理解就是几个“最”字,在对问题求解时,往往寻找它的最优解,并不是整体的最优解,而是局部的最优解,总是从目前来看是最优的选择。

  而验证是否为最优解的同时,可以用反证法证明目前是否为最优解情况,若不是则继续寻找最优解的情况。

  贪心算法往往寻找的不是整体的最优解,是选择每一步的最优解,累积起来,结果不等于最优解但接近于最优解。

 

二、汽车加油问题

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


运行代码:
#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!”。

 

三、总结体会

  贪心算法就动态规划来说简单了许多,只需要考虑每一步最优的情况,并实现便能很快的解决问题,自己能够想出解决办法,并且实现代码,可以让自己对于贪心的理解更加深入,只需要多做一些题目,便能对贪心更好的掌握,结对编程时,对于同一个问题总能有不同的想法,互相交流时可以提高自己的思维方式,从另一方面考虑问题也能实现同一个问题的答案,每一次结对编程都能够有所收获并且期待着下一次的结对编程。

 

posted @ 2019-11-24 17:29  严德怀  阅读(121)  评论(0编辑  收藏  举报