一、           你对贪心算法的理解

 

贪心算法总是做出在当前看来是最好的选择,但不一定是整体的最优,只是在某种意义上的局部最优选择。

二、           请说明汽车加油问题的贪心选择性质

 

题目来源:王晓东《算法设计与分析》

 

一辆汽车加满油后可行驶 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

 

题目分析:

做法:用逐次删去的策略不够好,用“used”来存放已经使用的油量,

当used大于里程的时候cnt++,这样的策略比较好

 

实现代码:

#include<bits/stdc++.h>

using namespace std;/*做法:用7逐次删去的策略不够好,用“used”来存放已经使用的油量,

当used大于里程的时候cnt++,这样的策略比较好*/

#define max 10000

int dis[max];

//int cnt = 0; 坑点  全局变量不能随便用  无解时候用cout cnt 会多一个cnt 

int use = 0;

void fun(int n, int k){//n公里 k个加油站

        int cnt  = 0;

        for(int i = 0; i <= k; ++i){

        if(dis[i] > n){

            cout<< "No Solution!";

            return;

            }

        }

        for(int i = 0; i <= k; ++i){

            use += dis[i];

            if(use > n){ // 如果是等于k 说明还是能够到达的

            cnt ++;

            // use = 0; 是错误的 正确做法是cnt++ 令use等于本次里程

            use = dis[i];

        }

    }

    cout << cnt;

    return;

}

int main(){

    int n, k;

    cin >> n >> k;

    for(int i = 0; i <= k; i++){

        cin >> dis[i];

    }

    fun(n,k);

    return 0;

}

 

三、           请说明在本章学习过程中遇到的问题及结对编程的情况

贪心策略不像动态规划那么绕,但它也有它的难点所在,比如不是所有题目都可以用贪心策略来解决的。例如第四章作业题里的货币找零,货币可能会出现“18 = 9 * 2 or 18 = 10 + 5 + 3”这样的情况。所以如何“因地制宜”调整贪心策略则成了我们需要学习的地方。

我和我的小伙伴合作得很融洽,他也一直在带我,我也一直在进步,我们决定期末的大作业做一个刷题小帮手,希望接下来的日子多多加油啦。

 

posted on 2019-11-26 22:55  江元发  阅读(15)  评论(0编辑  收藏  举报