算法第四章作业

1. 对贪心算法的理解:贪心算法总是做出在当前看来是最好的选择,并不从整体最优上加以考虑,而是局部最优选择。可用贪心算法求解的问题一般具有两个性质:贪心选择性质和最优子结构性质。

贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优解的选择。通过自顶向下迭代的方式,每次选择将所求问题简化为规模更小的子问题。当一个问题的最优解包含其子问题的最优解时,称此问题具有最优最优子结构性质。

2. 汽车加油问题

题目:一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少。

输入格式:第一行有 2 个正整数n和 k(k<=1000 ),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。 第二行有 k+1 个整数,表示第 k 个加油站与第k-1 个加油站之间的距离。 第 0 个加油站表示出发地,汽车已加满油。 第 k+1 个加油站表示目的地。

输出格式:输出最少加油次数。如果无法到达目的地,则输出“No Solution!”。

 

对于这个问题:设加油次数为k,每个加油站间距离为a[i];i=0,1,2,3……n
若存在某一段路程所需油量大于汽车最大油量,则汽车无法到达终点,输出"No Solution!”

其他使用贪心算法解决问题,从a[0]开始遍历,检查每一小段路程是否超过汽车满油量时的最大支撑路程。如果可以则在当前油量减去该路程所耗油量得到所剩油量,继续跟下一段路程进行比较;如果有超过的,那么汽车不可能走完这段路, 则充满油后继续向前遍历,加油次数加一。代码如下:

#include<iostream>
using namespace std;

int main(){
int n,k; //n: 最大油量 k:加油站个数
int ds[1000]; //起点、终点以及各加油站间的距离

cin>>n>>k;
for(int i = 0; i<=k ;i++){
cin>>ds[i];
}

int flag=1;//标记是否可以到达 flag=1 代表可达
int min = 0; // 最少加油次数
int rest = n; //目前可用油量

for(int i=0;i<=k;i++){
if(n<ds[i]){//满油状态下无法 达到下一个 加油站,可以返回了
cout<<"No Solution!"<<endl;
return 0;
}
if(rest-ds[i]>=0){//剩余油量 行驶ds[i]公里 ,仍然有剩余
rest-=ds[i];//减去行驶的油量,继续
}else{//当前剩余的油量 行驶 ds[i]公里 到达不了 下一个 加油站
rest=n;//到达不了 ,则在当前加油站 加满油量
rest-=ds[i];//然后 行驶 ds[i]公里 ,剩余 油量 继续减去
min++;//记录加油的次数
}
}

cout<<min<<endl;
return 0;
}

3. 本章学习过程中遇到的问题及结对编程的情况:

本周贪心算法的学习,总体上基本理解,掌握,但是有一些题目的细节问题没有考虑周全,而得出错误的贪心策略。

结伴编程情况同前几周一样,没有出现其他问题。

posted @ 2020-11-14 22:39  hshuqi  阅读(164)  评论(0编辑  收藏  举报