一、基本概念
所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。 所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。
二、基本思路
1.建立数学模型来描述问题。-------贪心的策略(排序方式)一般就出自数学模型2.把求解的问题分成若干个子问题。----推导出数学模型的分析依据3.对每一子问题求解,得到子问题的局部最优解。4.把子问题的局部最优解合成原来解问题的一个解。
三、适用问题
贪心策略适用的前提是:局部最优策略能导致产生全局最优解。
四、实现框架
从问题的某一初始解出发;
while (能朝给定总目标前进一步)
{
利用可行的决策,求出可行解的一个解元素;
}
由所有解元素组合成问题的一个可行解;
五、【总结】:
1、该问题是否能用贪心解决:想要解决这个问题,而这个问题又有许多局部问题,则求出局部最优解,从而推送到全局最优解
2、贪心策略的选择是否正确:要进行适当的验证
贪心策略就是选择将数据如何排序,贪心问题的数据一般是用结构体存储,并且是二维的(例如时间 t 和花费的代价 d ),排序方式可以如下:
1、单独按某一变量排序,return a.t>b.t;
2、加法排序 return a.t+a.d<b.t+b.d;
3、乘法排序 return a.t*a.d<b.t*b.d;
4、除法排序 return 1.0*a..t/a.d<1.0*b.t/b.d;
无论选择哪种排序方法,都要事先代入多组数据验证;若结果出现WA,从以下两方面入手排除错误:
1、数据范围选择过小,改用long long尝试
2、排除数据范围的问题,那一般就是排序方法出错,在仔细考虑如何正确排序