第四章作业
一、对贪心算法的理解
我认为贪心算法就是以局部最优达到全局最优,比如说货币找零问题,就是先把最大面值的纸币给出去,再一步步往后分析,贪心算法的每一步都是对当前问题来说最好的解决方法。
二、汽车加油问题
(1)问题描述
(2)贪心算法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 using namespace std; 3 4 int main(){ 5 int n,k;//汽车加满油后可行驶n公里,途中有k个加油站 6 cin >> n >> k; 7 int a[k+1];//a[k]是第k 个加油站与第k-1个加油站的距离 8 int distance=0;//出发点到目的地的距离 9 int sum = 0; 10 int count = 0; 11 bool flag = true; 12 for(int i=0;i<k+1;i++){ 13 cin >> a[i]; 14 if(a[i]<=n){ 15 distance+=a[i]; 16 sum += a[i]; 17 if((sum+a[i+1]) >= n) { 18 // cout << i <<": " << sum << endl; 19 sum = 0; 20 count++; 21 // cout << i <<": " << count << endl; 22 } 23 } 24 } 25 // cout << distance<< endl; 26 // cout << count; 27 for(int i=0;i<k+1;i++){ 28 if(a[i] > n && flag){ 29 flag = false; 30 break; 31 } 32 } 33 if((count*n) < distance || flag == false) cout << "No Solution!"; 34 else if(distance <= n ) cout << "0"; 35 else cout << count; 36 return 0; 37 38 }
分析:
1.数据结构:
①a[k+1]是第k 个加油站与第k-1个加油站的距离 ②distance是指出发点到目的地的距离
③sum是我用于判断我不加油是否能够支撑到下一个加油站 ④count是最少加油次数 ⑤flag是用来判断加满油之后是否能够支撑到下个加油站,即两个加油站之间的距离是否大于加满油后的最大行驶距离
2.分析
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 for(int i=0;i<k+1;i++){ 2 cin >> a[i]; 3 if(a[i]<=n){ 4 distance+=a[i]; 5 sum += a[i]; 6 if((sum+a[i+1]) >= n) { 7 // cout << i <<": " << sum << endl; 8 sum = 0; 9 count++; 10 // cout << i <<": " << count << endl; 11 } 12 } 13 }
最里面的那层循环是在判断经过前面几次的加油站若不加油 能否坚持到下一个加油站,若不可以,则将sum 置0 重新开始
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 for(int i=0;i<k+1;i++){ 2 if(a[i] > n && flag){ 3 flag = false; 4 break; 5 } 6 } 7 if((count*n) < distance || flag == false) cout << "No Solution!"; 8 else if(distance <= n ) cout << "0"; 9 else cout << count;
三、结对编程的情况
这学期已经经历了3次结对编程,在结对编程的过程中,我向我的搭档雯静,学到了很多,她总能很灵活的应用课上学到的思想到题目了,这点我要向她学习,而且每次我不懂得时候,她都很nice的
教我,而这次第四章实践题我们都遇到一个最优合并子序列最后一个测试点不过的情况,我们还在努力的改进,希望我们的进步越来越大,算法大作业好好做。