算法第四章作业
一、贪心算法的理解
贪心算法又称之为贪婪算法,在考虑问题时,总是做出在当前状况来说最好的算则,而不从整理来考虑。从某种意义上说是局部最优解,贪心算法所得到的答案并不一定是整体最优解,所以在使用贪心算法一定要考虑清楚,是否能使用贪心算法。选择的贪心策略必须具有无后效性,即当前选择的结果必须不能对之前的结果状态产生影响,而只与当前状态有关。
贪心算法的主要思想:
- 建立数学模型来描述问题。
- 把求解问题分成若干个子问题。
- 对每一子问题求解,得到子问题的局部最优解。
- 把子问题的局部最优解合成原来解问题的一个解。
二、题目讲解
解题思路:
因为要使加油次数最少,所以要尽可能的不加油,即每次都尽量开到能到达的最远的加油站才加油。动态判断能不能到达下一个加油站,能就继续行驶到下一个加油站,不能就在此加油站加油。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[1005]; 4 int main(){ 5 int n,k,ans=0,len=0; 6 bool flag=1; 7 cin>>n>>k; 8 for(int i=0;i<=k;i++){ 9 cin>>a[i]; 10 len+=a[i]; 11 if(a[i]>n) flag=0; 12 } 13 if(flag==0) { 14 cout<<"No Solution!\n"; 15 return 0; 16 } 17 if(len<=n){ 18 cout<<0<<'\n'; 19 return 0; 20 } 21 int i=0,you=n; 22 while(i<=k){ 23 you-=a[i]; 24 if(you>=0) i++; 25 else{ 26 you=n; 27 ans++; 28 } 29 } 30 cout<<ans<<'\n'; 31 return 0; 32 }
三、心得体会
贪心算法的关键在于找出贪心策略,只要找到了贪心策略就能够轻松解决题目,但如果找不到正确的策略就很难解决了。
这一章总体来说还是比较简单的,结对编程的过程也比较顺利,在实验课中顺利的写出三题,彼此互相帮助互相促进,加强了对贪心算法的理解和熟练。