Skip to main content

贪心算法

贪心算法遵循一种近似解决问题的技术,期盼通过每个阶段的局部最优选择(当前最好的解),
从而达到全局的最优(全局最优解)。它不像动态规划算法那样计算更大的格局。

同样可以解决动态动态规划话题中找零问题和背包问题

硬币找零

function minCoinChange(coins, amount) {  
const change = [];
let total = 0;
for (let i = coins.length; i >= 0; i--) { // {1}
const coin = coins[i];
while (total + coin <= amount) { // {2}
change.push(coin); // {3}
total += coin; // {4}
}
}
return change;
}
不得不说贪心版本的minCoinChange比动态规划版本简单多了。对每个面额(行{1}——从大到小),把它的值和total相加后,total需要小于amount(行{2})。
我们会将当前面额coin添加到结果中(行{3}),也会将它和total相加(行{4})。
如你所见,这个贪心解法很简单。从最大面额的硬币开始,拿尽可能多的这种硬币找零。当无法再拿更多这种价值的硬币时,开始拿第二大价值的硬币,依次继续。

用和DP方法同样的测试代码测试。
console.log(minCoinChange([1, 5, 10, 25], 36));

然而,如果用[1, 3, 4]面额执行贪心算法,会得到结果[4, 1, 1]。如果用动态规划的解法,会得到最优的结果[3, 3]。
比起动态规划算法而言,贪心算法更简单、更快。然而,如我们所见,它并不总是得到最优答案。但是综合来看,它相对执行时间来说,输出了一个可以接受的解。