1. 找零问题
找零问题是贪心算法的一个经典应用场景。假设有一定面额的货币,我们希望用最少的硬币凑出指定金额。以下是找零问题的Python实现:
# 找零问题
t = [100, 50, 20, 10, 5, 1]
def change(t, n):
m = [0 for _ in range(len(t))] # 初始化用于存储每种面额找零数量的列表
for i, money in enumerate(t):
m[i] = n // money # 计算当前面额的找零数量
n = n % money # 更新剩余的金额
return m, n
print(change(t, 468))
2. 分数背包问题
分数背包问题是背包问题的一种变体,允许将物品分割为更小的部分。以下是分数背包问题的实现:
# 分数背包
goods = [(60, 10), (100, 20), (120, 30)]
goods.sort(key=lambda x: x[0] / x[1], reverse=True) # 根据单位重量的价值进行降序排序
def fractional_backpack(goods, w):
m = [0 for _ in range(len(goods))] # 初始化用于存储每种物品选择比例的列表
total_v = 0
for i, (price, weight) in enumerate(goods):
if w >= weight:
m[i] = 1 # 如果当前物品可以完全放入背包,选择比例为1
w -= weight # 更新背包剩余容量
total_v += price # 更新总价值
else:
m[i] = w / weight # 如果当前物品不能完全放入背包,选择比例为剩余容量与物品重量的比值
w = 0 # 背包容量已满,将剩余容量置为0
total_v += m[i] * price # 更新总价值
break
return m, total_v
print(fractional_backpack(goods, 50))
3. 拼接最大数问题
拼接最大数问题要求从给定的数字序列中取出若干数字,使得这些数字拼接起来的结果最大。以下是拼接最大数问题的实现:
# 拼接最大数问题
from functools import cmp_to_key
li = [32, 98, 128, 1286, 6, 71]
def xy_cmp(x, y):
if x + y < y + x:
return 1
elif x + y > y + x:
return -1
else:
return 0
def number_join(li):
li = list(map(str, li))
li.sort(key=cmp_to_key(xy_cmp)) # 根据xy_cmp函数定义的规则进行排序
return "".join(li)
print(number_join(li))
4. 活动选择问题
活动选择问题是贪心算法的经典问题,要求在一系列互相兼容的活动中选择尽可能多的活动。以下是活动选择问题的实现:
# 活动选择问题
activities = [(1, 4), (3, 5), (0, 6), (5, 7), (3, 9), (5, 9), (6, 10), (8, 11), (8, 12), (2, 14), (12, 16)]
activities.sort(key=lambda x: x[1]) # 根据结束时间进行排序
def activities_selection(a):
res = [a[0]]
for i in range(1, len(a)):
if a[i][0] > res[-1][1]:
res.append(a[i])
return res
print(activities_selection(activities))
通过以上示例,我们详细介绍了找零问题、分数背包问题、拼接最大数问题和活动选择问题的贪心算法实现。这些问题在实际应用中具有广泛的应用,通过贪心算法可以简单而高效地解决。希望读者能够从中学到有关贪心算法的思想和实现方法。