贪心算法
基本思想:
贪心算法通过一系列的选择来得到问题的解,其中每一个选择都是当前状态下局部最好的选择,即贪心选择
它有两个重要性质:贪心选择性质和最优子结构性质。
贪心选择性质:指问题的最优解可以通过一系列局部最优解的选择得到。贪心算法做贪心选择可
以依赖于以往所做过的选择,但决不依赖于将来所作的选择,也不依赖于子问题的解。
最优子结构性质:指问题的最优解包含其子问题的最优解。
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; }
结对编程以及学习心得:
在本章学习中出现的问题较少,大概因为贪心思想在生活中较常见,因此理解起来不太困难
在学习中有些贪心策略的证明还是较难理解,需要经常回顾练习才能较熟练。结对编程中两个
人的配合比之前更好一些,能够在实践中一同理解一起做出题目,希望能够更进一步。