35 lines
1.6 KiB
Python
35 lines
1.6 KiB
Python
|
"""
|
|||
|
「贪心算法 greedy algorithm」是一种常见的解决优化问题的算法,其基本思想是在问题的每个决策阶段,
|
|||
|
都选择当前看起来最优的选择,即贪心地做出局部最优的决策,以期获得全局最优解。
|
|||
|
|
|||
|
- 动态规划会根据之前阶段的所有决策来考虑当前决策,并使用过去子问题的解来构建当前子问题的解。
|
|||
|
- 贪心算法不会考虑过去的决策,而是一路向前地进行贪心选择,不断缩小问题范围,直至问题被解决。
|
|||
|
"""
|
|||
|
|
|||
|
"""
|
|||
|
使用贪心算法解决“零钱兑换问题”,给定目标金额,我们贪心地选择不大于且最接近它的硬币,不断循环该步骤,直至凑出目标金额为止。
|
|||
|
"""
|
|||
|
|
|||
|
"""
|
|||
|
贪心算法不仅操作直接、实现简单,而且通常效率也很高。
|
|||
|
|
|||
|
然而,对于某些硬币面值组合,贪心算法并不能找到最优解。也就是说,对于零钱兑换问题,贪心算法无法保证找到全局最优解,
|
|||
|
并且有可能找到非常差的解。它更适合用动态规划解决。
|
|||
|
|
|||
|
相较于动态规划,贪心算法的使用条件更加苛刻,其主要关注问题的两个性质。
|
|||
|
- 贪心选择性质:只有当局部最优选择始终可以导致全局最优解时,贪心算法才能保证得到最优解。
|
|||
|
- 最优子结构:原问题的最优解包含子问题的最优解。
|
|||
|
"""
|
|||
|
|
|||
|
def coin_change_greedy(coins: list[int], amt: int):
|
|||
|
i = len(coins) - 1
|
|||
|
count = 0
|
|||
|
|
|||
|
while amt > 0:
|
|||
|
while i > 0 and coins[i] > amt:
|
|||
|
i -= 1
|
|||
|
amt -= coins[i]
|
|||
|
count += 1
|
|||
|
|
|||
|
return count if amt == 0 else -1
|