zoukankan      html  css  js  c++  java
  • 贪心算法理解

    贪心算法

    基本思想:

    贪心算法通过一系列的选择来得到问题的解,其中每一个选择都是当前状态下局部最好的选择,即贪心选择

    它有两个重要性质:贪心选择性质和最优子结构性质。

    贪心选择性质:指问题的最优解可以通过一系列局部最优解的选择得到。贪心算法做贪心选择可

    以依赖于以往所做过的选择,但决不依赖于将来所作的选择,也不依赖于子问题的解。

    最优子结构性质:指问题的最优解包含其子问题的最优解。

    7-1:汽车加油问题

    题目大意:

    汽车加满油后可行驶n公里,途中存在一些加油站,求出汽车到达终点时沿途加油次数

    最少的方案并求出加油次数。输入n,k。其中n为汽车加满油行驶公里数,k为加油站个数,接下

    来有k+1个数表示每个加油站之间的距离。加油站0表示出发点,加油站k+1表示终点,若无法达到

    终点则输出No Solution!,否则输出最少加油次数。

    贪心策略:

    若要汽车到达终点沿途加油的次数最少,只需要每次尽可能走最远,去较远的加油站加油即可。每次判断该

    汽车能否顺利到达下一个加油站,若能到达则在下一个加油站继续判断,直到汽车剩余的油无法支撑汽车前

    往下一个加油站时,就在当前站加油。这样能够保证汽车在一定油量时尽可能走的更远。加油次数最少。

    代码:

    #include<iostream>
    using namespace std;
    int n,k;
    int a[1009];
    int main()
    {
        cin>>n>>k;
        for(int i=0;i<=k;i++)
            cin>>a[i];
            
        int ans=0,count=n;
        bool flag=true;
        for(int i=0;i<=k;i++)
        {
            if(count-a[i]>=0)                //若能到达下一个加油站 
                count-=a[i];
            else                            //否则在当前加油站加油 
            {
                count=n;
                count-=a[i];                
                if(count<0)flag=false;        //如果加满油依然不能到达下一个加油站,则无法到达终点 
                ans++;                        //加油次数 
            }
        }
        if(!flag)cout<<"No Solution!"<<endl;
        else cout<<ans<<endl;
        return 0;
    } 

    结对编程以及学习心得:

    在本章学习中出现的问题较少,大概因为贪心思想在生活中较常见,因此理解起来不太困难

    在学习中有些贪心策略的证明还是较难理解,需要经常回顾练习才能较熟练。结对编程中两个

    人的配合比之前更好一些,能够在实践中一同理解一起做出题目,希望能够更进一步。

  • 相关阅读:
    Bzoj3998 [TJOI2015]弦论
    Bzoj3669 [Noi2014]魔法森林
    Bzoj2157 旅游
    Bzoj3282 Tree
    POJ1743 Musical Theme
    CodeVs1515 跳
    Bzoj1013 [JSOI2008]球形空间产生器sphere
    Bzoj1007 [HNOI2008]水平可见直线
    洛谷P3120 [USACO15FEB]Cow Hopscotch
    洛谷P3112 [USACO14DEC]后卫马克Guard Mark
  • 原文地址:https://www.cnblogs.com/LjwCarrot/p/10031338.html
Copyright © 2011-2022 走看看