一、对贪心算法的理解
概念:贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
性质:贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
体会:在解决不同的问题时常常需要寻找不同的贪心策略,有些问题看似正确的贪心策略其实是有许多隐藏很深的反例,所以在运用贪心算法之前需要进行一些简单的证明。
二、汽车加油问题
1 #include <iostream> 2 using namespace std; 3 int a[1005]; 4 int main(){ 5 int n,k,cnt=0,i; 6 cin>>k>>n; 7 int oil = k; 8 for(int i=0;i<=n;i++){ 9 cin>>a[i]; 10 } 11 for(i=0;i<=n;i++){ 12 if(oil>=a[i]){ 13 oil -= a[i]; 14 } 15 else{ 16 if(a[i]<=k){ 17 oil = k-a[i]; 18 cnt++; 19 } 20 else break; 21 } 22 } 23 if(i==n+1) cout<<cnt<<endl; 24 else cout<<"No Solution!"<<endl; 25 }
贪心思想:当汽车所剩的油量不可以行驶至下一加油站时,则输出“No Solution!”,故可以将贪心策略设为在每一个加油站加尽可能多的油(即加满),当汽车所剩油量不足以到达下一站时,则需加油,采用一个cnt变量记录加油的次数,当经过所有的加油站(i=n+1),即到达了目标地点,输出cnt。
三、本章学习过程中遇到的问题及结对编程的情况
遇到的问题:遇到一些题目,很明显能断定是一道考察贪心算法思想的题目,但是不太清楚应该如何选择正确的贪心策略,以达到解决问题的目的,因为贪心的方式多种多样。
结对编程情况:经常与队友一起探讨问题,交流互相的思路,在做完作业题之后与队友进行交流发现我们想的都是差不多的,运用了同样的方法。有时他能轻易发现我发现不了的错误,我也能发现他的错误。