pygorithm/greedy/greedy.py

35 lines
1.6 KiB
Python
Raw Permalink Normal View History

2023-12-22 19:23:39 +08:00
"""
贪心算法 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