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;
    } 

    结对编程以及学习心得:

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

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

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

  • 相关阅读:
    Eureka的工作原理以及它与ZooKeeper的区别
    利用javascript判断文件是否存在
    带jsk证书,请求https接口
    C# .net 数组倒序排序
    C#中ArrayList和string,string[]数组的转换
    C#中遍历ArrayList的三种方法
    求其中同一个主叫号码的两次通话之间间隔大于10秒的通话记录ID
    启动tomcat时,一直卡在Deploying web application directory这块的解决方案
    Linux下修改Mysql的用(root的密码及修改root登录权限
    启动MySql提示:The server quit without updating PID file(…)失败
  • 原文地址:https://www.cnblogs.com/LjwCarrot/p/10031338.html
Copyright © 2011-2022 走看看