贪婪算法
贪婪算法的基本思路是,从局部的解最优来得到全局的最优解,从问题的某一个初始解开始,逐步逼近给定的目标,尽可能的求得更好的解。当算法的某一布不能继续前进时,就停止算法给出近似解。
贪婪算法存在以下问题:
1、不能保证最后的解是最优的(因为可能是近似值)
2、不能用来求最大或最小解问题
3、只能求满足某些约束条件的可行解的范围。
例题:换零钱。人民币有
100、50、20、10、5、2、1、0.5、0.1
等面值,找零钱时有多种方案,使用贪婪算法,将尽可能快速的得出组合方案,所以从局部开始,从最大面值开始然后向下。
解:
function exchange($n) { $money = [100, 50, 20, 10, 5, 2, 1, 0.5, 0.1]; for ($i = 0; $i < count($money) - 1; $i++) { if ($n >= $money[$i]) break; } $sum = 0; $res = []; while ($n - $sum >= 0) { if ($sum + $money[$i] < $n) { $sum += $money[$i]; if (isset($res[$i])) $res[$i] += 1; else $res[$i] = 1; } elseif ($sum + $money[$i] == $n) { if (isset($res[$i])) $res[$i] += 1; else $res[$i] = 1; break; } else { $i++; } } foreach($res as $key =>$val){ echo "需要{$money[$key]}面值的{$val}张 <br>"; } }