算法第四章作业
- 你对贪心算法的理解
当一个问题具有最优子结构性质时,可用动态规划进行求解,有时也使用贪心算法,贪心算法并不从整体上最优加以考虑,它所做出的选择只是从某种意义上的局部最优,并不是所有问题的最优解。
2.请说明汽车加油问题的贪心选择性质
汽车加油问题:假设不到万不得已我们不加油,即除非我们油箱里的油不足以开到下一个加油站,我们才加一次油。在局部找到一个最优的解。却每加一次油,看作是一个新的起点,用相同的递归方法进行下去。最终将各个阶段的最优解合并为原问题的解得到我们原问题的求解。且在加满油后可行驶的N千米这段路程上任取两个加油站A、B,且A距离始点比B距离始点近,则若在B加油不能到达终点那么在A加油一定不能到达终点,因为m+N<n+N,即在B点加油可行驶的路程比在A点加油可行驶的路程要长n-m千米,所以只要终点不在B、C之间且在C的右边的话,根据贪心选择,为使加油次数最少就会选择距离加满油得点远一些的加油站去加油。
#include <iostream> using namespace std; void oil(int n,int k,int a[]){ int flag =0; int temp=1; for(int i=0;i<k+1;i++){ if(a[i]>n){ temp = 0; break; } } for(int i=0,s=0;i<k+1;i++){ s = s+a[i]; if(s>n){ flag++; s = a[i]; } } if(temp==1) cout<<flag<<endl; else cout<<"No Solution!"<<endl; } int main(){ int n,k; cin>>n>>k; int a[1000]; for(int i=0;i<k+1;i++){ cin>>a[i]; } oil(n,k,a); return 0; }
3.请说明在本章学习过程中遇到的问题及结对编程的情况
在进行汽车加油问题求解时因为忽略了如果汽车中途加满油也无法驶向下一站这个问题,导致输出结果为“no solution 2 "等情况的出现,后来增加了判断才求出正确的结果。就是结队编程的队友指出这个问题,一开始自己找了好久,还是通过不了第三个测试点。第二题会场安排问题一开始是根据最早结束时间来安排,导致无法通过第3个测试点,后更改为最早开始来安排会场问题,得以解决。