基本思想
生活中有很多使用贪心思想的例子,比如找零钱,如果售货员需要找给小朋友67美分的零钱,售货员手中只有25美分、10美分、5美分和1美分的硬币,她的做法是:先找不大于67的25美分2个,再找不大于17的10美分1个,再找不大于7的5美分1个,最后找2个1美分,最后,找给小朋友6枚硬币。我们不难发现售货员的目标是硬币个数尽可能少。
再看一个经典的背包问题,假设有\(n\)个物品,他们的体积相同,重量分别为\(w_1, w_2, ..., w_n\),背包的最大载重量是\(c\),目标是往背包里装入尽可能多的物品,一个自然的想法是“先装重量最轻的物品”。如果用数学语言描述这个问题是这样的:
其中\(x_i\)表示是否选择第\(i\)件物品,1时选择,0时不选择。
从中我们不难发现贪心算法的基本思想。贪心算法,是在决策中总是做出在当前看来是最好的选择。但是我们必须注意的是,局部最优并不等同于全局最优,所以贪心算法并不一定总能得到正确的解。但是必须指出的是,有相当一部分问题是可以由贪心原则达到整体最优的。
背包问题
本节中提到的背包问题特指可分割的背包问题。
已知容量为\(M\)的背包和\(n\)件物品。第\(i\)件物品的重量为\(w_i\),价值是\(p_i\)。因而将物品\(i\)的一部分\(x_i\)放进背包即获得 \(p_ix_i\)的价值。问题是:怎样装包使所获得的价值最大?即是如下的优化问题:
因为物品可分割,所以我们优先装单价最高的物品,这样就可以得到这个优化问题的最优解。这里必须指出的是,我们并没有证明局部最优就可以达到全局最优,事实上,这个问题是可以通过严谨的数学语言证明的,由于篇幅所限,这里不做介绍。
贪心算法主要用于处理优化问题。每个优化问题都是由目标函数和约束条件组成。满足约束条件的解称为可行解,而那些使得目标函数取得最大(最小)值的可行解称为最优解。如背包问题是一个优化问题,\(\sum\limits_{i = 1}^n { {p_i}{x_i}}\)是目标函数,而\(\sum\limits_{i = 1}^n { {w_i}{x_i} \le M,{x_i} = [0,1]}\