贪心算法理解

贪心算法

基本思想:

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

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

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

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

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

 

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

 

结对编程以及学习心得:

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

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

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

 

posted @ 2018-11-28 12:05  _Carrot  阅读(650)  评论(0编辑  收藏  举报