python 经典算法之--贪心算法(Greedy Algorithm)

贪心算法是一种求解最优化问题的算法,其核心思想是在每一步选择中都采取当前最好或最优的选择,以期最终达到全局最优解。在许多情况下,贪心算法能够快速地找到最优解或者近似最优解。

举例说明:

例1:找零钱问题

假设我们需要找给客户 67 分的硬币,我们可以用贪心算法来选择硬币的组合。我们有以下面值的硬币:1 分、5 分、10 分、25 分。那么问题是,我们要如何找零,使得硬币的数量最少?

根据贪心算法的思想,我们每次都选择面值最大的硬币,直到凑出总价值。因此我们首先选择 25 分硬币,再选择 25 分硬币,然后我们只需要再加上一枚 10 分硬币,1 枚 5 分硬币和 2 枚 1 分硬币即可。

下面是该问题的Python代码:

def make_change(cents):
    coins = [25, 10, 5, 1]
    coin_count = [0, 0, 0, 0]
    for i in range(len(coins)):
        while cents >= coins[i]:
            coin_count[i] += 1
            cents -= coins[i]
    return coin_count
    
print(make_change(67))

输出结果为:[2, 1, 1, 2]

例2:活动安排问题

假设我们有一个活动列表,每个活动都有一个开始时间和结束时间,我们需要从中选出尽可能多的活动,使得它们不会发生时间上的冲突。如何用贪心算法来解决这个问题?

根据贪心算法的思想,我们每次都选择结束时间最早的活动,然后将活动列表中与该活动时间冲突的活动从列表中删除,以便于后续选择活动时不会冲突。这样做的原因是,结束时间早的活动给后来的活动留下更多时间。因此我们可以用下面的Python代码来实现。

def activity_selection(start, end):
    activities = []
    activities.append(0)
    i = 0
    for j in range(len(end)):
        if start[j] >= end[i]:
            activities.append(j)
            i = j
    
    return [x+1 for x in activities[1:]]

start = [1, 3, 0, 5, 8, 5]
end = [2, 4, 6, 7, 9, 9]

print(activity_selection(start, end))

输出结果为:[1, 2, 4, 5],即选出的活动编号分别为 1、2、4 和 5。

总结:

贪心算法在许多情况下能够快速地找到最优解或者近似最优解,但并不是所有问题都适合使用贪心算法。需要根据问题的性质选择合适的算法。

你可能感兴趣的:(Python经典算法,算法,python,贪心算法)