一般地,有这样一类问题:它有n个输入,而它的解就由这n个输入的某个子集组成,只是这个子集必须满足某些事先给定的条件。把那些必须满足的条件称为约束条件;而把满足约束条件的子集称为该问题的可行解。为了衡量可行解的优劣,事先给出了一定的标准。一般以函数形式给出,称为目标函数。那些使目标函数取极值(极大或极小)的可行解,称为最优解。
eg:用贪心法求解货币兑付问题。设支付现金
A=25.9元,支付集合P= {10、5、1、
0.5,0.2、0.1元各10张}
解:最少货币张数 — 贪心选择货币面值大者。
s = ф
s = {10} 15.9
s = {10,10} 5.9
s = {10, 10, 5, 0.5, 0.2, 0.2} 0
贪心法也是一个多步决策法。每一步选择都使得能构成问题的一个可行解,同时使目标函数的值增加最快(求max)或增加最小(如求min),这种选择过程是以某些最优量度为根据,而最优化量度有时可以是目标函数本身,也可以是别的量度。最优化度量的选择是贪心算法的关键。
证明正确性的方法:算法步数的归纳、问题规模的归纳。
(1)背包问题
问题描述:给定n个物品和一个背包。物品i的重量为wi,价值为vi,背包容量为C。问如何选择装入背包中的物品,使得装入背包的物品的价值最大?
在装入背包时,每种物品i只有两种选择,装入或者不装入,既不能装入多次,也不能只装入一部分。因此,此问题称为0-1背包 问题。
如果在装入背包时,物品可以切割,即可以只装入一部分,这种情况下的问题称为背包问题。
这2类问题都具有最优子结构性质,极为相似,但背包问题可以用贪心算法求解,而0-1背包问题却不能用贪心算法求解。
0-1背包问题与背包问题:
背包问题的形式描述:
实例:
度量标准的选择:三种不同的选择
(a)以价值作为度量
(b)以容量作为度量
(c)最优的度量标准(每一单位容量能获得当前最大的单位效益)
最优解的证明
贪心解是可行解,故只需证明:贪心解可使目标函数取得极值。