第四章作业
1.你对贪心算法的理解(2分)
定义:贪心算法是指在每一步求解的步骤中,它要求“贪婪”的选择最佳操作,并希望通过一系列的最优选择,能够产生一个问题的(全局的)最优解。
特征:
(1)可行的:即它必须满足问题的约束。
(2)局部最优:它是当前步骤中所有可行选择中最佳的局部选择。
(3)不可取消:即选择一旦做出,在算法的后面步骤就不可改变了。
补充:
(1)贪心算法的每一步都有一组选择,总是作出在当前来看是最好的选择。
(2)贪心算法并不从整体最优上来考虑,所作出的选择只是某种意义上的局部最优选择。
(3)贪心算法并不能保证最终结果是最优的。
2.请说明汽车加油问题的贪心选择性质(2分)
#include<iostream> using namespace std; /*/题目: 一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。 设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少。 7 7 1 2 3 4 5 1 6 6 4 /*/ int main() { int i,j,a[1005];//i代表可行使i公里 cin >> i >> j; for(int t=0;t<=j;t++) //输入j+1个数 { cin >> a[t]; } a[j+1]=0; int sum =0,count=0,flag=0; for(int t =0; t<=j;t++) { sum=sum+a[t];//若剩余油量可以到达下一个目的地,则不加油。 if(i-sum<=a[t+1]&&i>=a[t])//若到剩余油量不够到达下一个加油站则加油 。 { sum=0; count++; } if(i<a[t])//若其中有一个目的地的距离超过最大行使距离,做标记。 flag=1; } if(flag==0) cout << count<<endl; if(flag==1) cout <<"No Solution!"<<endl; return 0; }
3.请说明在本章学习过程中遇到的问题及结对编程的情况(1分)
(1)问题:第一次把题目做出来的时候总是段错误,后面把思路调整了一下,就避免了这一个错误了。
(2)结对编程情况:和伙伴交流做题的思路可以让自己更理解问题,交流的过程中也会慢慢注意到自己之前忽略的问题。