算法复习-贪心算法

基本思想

生活中有很多使用贪心思想的例子,比如找零钱,如果售货员需要找给小朋友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\),目标是往背包里装入尽可能多的物品,一个自然的想法是“先装重量最轻的物品”。如果用数学语言描述这个问题是这样的:

\[\max \sum\limits_{i = 1}^n { {x_i}} ,(\sum\limits_{i = 1}^n { {w_i}{x_i} \le c,{x_i} = 0,1)} \]

其中\(x_i\)表示是否选择第\(i\)件物品,1时选择,0时不选择。

从中我们不难发现贪心算法的基本思想。贪心算法,是在决策中总是做出在当前看来是最好的选择。但是我们必须注意的是,局部最优并不等同于全局最优,所以贪心算法并不一定总能得到正确的解。但是必须指出的是,有相当一部分问题是可以由贪心原则达到整体最优的。

背包问题

本节中提到的背包问题特指可分割的背包问题。

已知容量为\(M\)的背包和\(n\)件物品。第\(i\)件物品的重量为\(w_i\),价值是\(p_i\)。因而将物品\(i\)的一部分\(x_i\)放进背包即获得 \(p_ix_i\)的价值。问题是:怎样装包使所获得的价值最大?即是如下的优化问题:

\[\max \sum\limits_{i = 1}^n { {p_i}{x_i}} ,(\sum\limits_{i = 1}^n { {w_i}{x_i} \le M,{x_i} = [0,1]} ) \]

因为物品可分割,所以我们优先装单价最高的物品,这样就可以得到这个优化问题的最优解。这里必须指出的是,我们并没有证明局部最优就可以达到全局最优,事实上,这个问题是可以通过严谨的数学语言证明的,由于篇幅所限,这里不做介绍。

贪心算法主要用于处理优化问题。每个优化问题都是由目标函数和约束条件组成。满足约束条件的解称为可行解,而那些使得目标函数取得最大(最小)值的可行解称为最优解。如背包问题是一个优化问题,\(\sum\limits_{i = 1}^n { {p_i}{x_i}}\)是目标函数,而\(\sum\limits_{i = 1}^n { {w_i}{x_i} \le M,{x_i} = [0,1]}\

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值