目录
例子1:
问题描述:
算法步骤:
代码:
结果:
例子2:
问题描述:
算法步骤:
代码:
结果:
结论:
贪心算法(Greedy Algorithm)是一种优化问题的算法范式,它通过每一步的局部最优选择来达到全局最优解。在每一步上做出当前情况下的最佳选择,而不考虑全局未来的影响。贪心算法通常比较简单、高效,并且适用于一些特定类型的问题。
基本思想:
1. 选择当前状态下的最优解。
2. 不考虑之前选择对未来的影响。
贪心算法的适用条件:
- 问题的最优解可以通过一系列局部最优选择得到。
- 不能回退(不能取消已经做出的选择)。
例子1:
找零钱问题
问题描述:
给定一些面额不同的硬币,要求用最少的硬币凑出某个金额。
算法步骤:
1. 对于每一个硬币,都选择尽量多的使用,直到超过目标金额。
2. 重复这个过程,直到凑出了目标金额。
代码:
def greedy_coin_change(coins, target_amount):coins.sort(reverse=True) # 面额大的硬币排在前面change = []remaining_amount = target_amountfor coin in coins:while remaining_amount >= coin:change.append(coin)remaining_amount -= coinif remaining_amount == 0:return changeelse:return "无法凑出目标金额"# 示例
coins = [25, 10, 5, 1]
target_amount = 63
result = greedy_coin_change(coins, target_amount)
print(result)
结果:
[25, 25, 10, 1, 1, 1]
在这个例子中,我们选择了尽量多地使用面额较大的硬币,从而达到用最少硬币凑出目标金额的目的。这是一个简单的贪心算法示例。需要注意的是,贪心算法并不总是能够得到全局最优解,但在一些问题上表现得非常好。
例子2:
活动选择问题(Activity Selection Problem)
问题描述:
在这个问题中,我们有一系列活动,每个活动都有一个开始时间和结束时间。我们的目标是选择最大数量的互不冲突的活动。
算法步骤:
- 将活动按结束时间从早到晚排序。
- 选择第一个活动。
- 从剩余的活动中选择第一个与前一个已选活动不冲突的活动。
- 重复步骤3,直到没有更多的活动可选。
代码:
def greedy_activity_selection(activities):# 按结束时间从早到晚排序activities.sort(key=lambda x: x[1])selected_activities = [activities[0]]# 记录上一个活动的结束时间last_end_time = activities[0][1]for activity in activities[1:]:start_time, end_time = activity# 只要开始时间大于上一个活动的结束时间,说明时间不冲突,就选择它if start_time >= last_end_time:selected_activities.append(activity)last_end_time = end_timereturn selected_activities# 示例
activities = [(1, 4), (3, 5), (0, 6), (5, 7), (3, 9), (5, 9), (6, 10), (8, 11), (8, 12), (2, 14), (12, 16)]
result = greedy_activity_selection(activities)
print(result)
结果:
[(1, 4), (5, 7), (8, 11), (12, 16)]
在这个例子中,我们按照活动的结束时间进行排序,并选择尽量早结束的活动。这样就能够安排更多的互不冲突的活动。这是一个典型的贪心算法应用。贪心算法在活动选择问题上表现得很好,因为每次选择都是局部最优的。
结论:
贪心算法是一个直接、简单、好用的算法。