贪心算法
贪心算法是动态规划算法的一种特殊情况。它并不从整体最优上进行考虑,所做的只是当前看来是最好的选择。当然,我们希望贪心算法得到的最终结果也是整体最优的。
不过,贪心算法并不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须无后效性(不可以回溯),即某个状态以前的过程不会影响以后的状态,只与当前的状态有关。
贪心算法的基本要素
最优子结构性质
和动态规划一样,只有具有最优子结构性质的问题才能使用贪心算法。当一个问题的最优解包含了其子问题的最优解,这个问题就具有最优子结构。
贪心选择性质
所求问题的整体最优解可以通过一系列局部最优的选择,及贪心选择来达到。
贪心算法存在的问题
- 不能保证所有求出来的解都是最佳的
- 不能用来求最大最小值问题
- 只能满足部分可行的问题
贪心算法的设计步骤
- 建立数学模型
- 将问题分解为若干个子问题
- 对每一个子问题求解,得到子问题的局部最优解
- 合并子问题的解,得到问题的整体最优解
经典例题
汽车加油问题
题目:
解析:
这道题的贪心策略是找到汽车加满油量时可以行驶到的最后一个加油站,在此加油站加满油之后继续前进。假如其中有两个加油站之间的距离大于汽车满油时可以行驶的路程,就输出“No Solution!”。
代码如下:
#include<iostream>
using namespace std;
#define MAX 1005
int counter; // 记录最少加油次数
int distances[MAX]; // 记录加油站之间的距离
int canDrive; // 一次加油可以行驶的距离
int num; // 加油站个数
void lessCo