一、 你对贪心算法的理解
贪心算法总是做出在当前看来是最好的选择,但不一定是整体的最优,只是在某种意义上的局部最优选择。
二、 请说明汽车加油问题的贪心选择性质
题目来源:王晓东《算法设计与分析》
一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少。
输入格式:
第一行有 2 个正整数n和 k(k<=1000 ),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。 第二行有 k+1 个整数,表示第 k 个加油站与第k-1 个加油站之间的距离。 第 0 个加油站表示出发地,汽车已加满油。 第 k+1 个加油站表示目的地。
输出格式:
输出最少加油次数。如果无法到达目的地,则输出“No Solution!”。
输入样例:
7 7
1 2 3 4 5 1 6 6
输出样例:
4
题目分析:
做法:用逐次删去的策略不够好,用“used”来存放已经使用的油量,
当used大于里程的时候cnt++,这样的策略比较好
实现代码:
#include<bits/stdc++.h>
using namespace std;/*做法:用7逐次删去的策略不够好,用“used”来存放已经使用的油量,
当used大于里程的时候cnt++,这样的策略比较好*/
#define max 10000
int dis[max];
//int cnt = 0; 坑点 全局变量不能随便用 无解时候用cout cnt 会多一个cnt
int use = 0;
void fun(int n, int k){//n公里 k个加油站
int cnt = 0;
for(int i = 0; i <= k; ++i){
if(dis[i] > n){
cout<< "No Solution!";
return;
}
}
for(int i = 0; i <= k; ++i){
use += dis[i];
if(use > n){ // 如果是等于k 说明还是能够到达的
cnt ++;
// use = 0; 是错误的 正确做法是cnt++ 令use等于本次里程
use = dis[i];
}
}
cout << cnt;
return;
}
int main(){
int n, k;
cin >> n >> k;
for(int i = 0; i <= k; i++){
cin >> dis[i];
}
fun(n,k);
return 0;
}
三、 请说明在本章学习过程中遇到的问题及结对编程的情况
贪心策略不像动态规划那么绕,但它也有它的难点所在,比如不是所有题目都可以用贪心策略来解决的。例如第四章作业题里的货币找零,货币可能会出现“18 = 9 * 2 or 18 = 10 + 5 + 3”这样的情况。所以如何“因地制宜”调整贪心策略则成了我们需要学习的地方。
我和我的小伙伴合作得很融洽,他也一直在带我,我也一直在进步,我们决定期末的大作业做一个刷题小帮手,希望接下来的日子多多加油啦。