pygorithm/greedy/greedy.py

35 lines
1.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""
「贪心算法 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