算法价值3-贪心算法

目录

例子1:

问题描述:

算法步骤:

代码:

结果:

例子2:

问题描述:

算法步骤:

代码:

结果:

结论:


贪心算法(Greedy Algorithm)是一种优化问题的算法范式,它通过每一步的局部最优选择来达到全局最优解。在每一步上做出当前情况下的最佳选择,而不考虑全局未来的影响。贪心算法通常比较简单、高效,并且适用于一些特定类型的问题。

基本思想:

  1. 选择当前状态下的最优解。

  2. 不考虑之前选择对未来的影响。

贪心算法的适用条件:

  • 问题的最优解可以通过一系列局部最优选择得到。
  • 不能回退(不能取消已经做出的选择)。

例子1:

找零钱问题

问题描述:

给定一些面额不同的硬币,要求用最少的硬币凑出某个金额。

算法步骤:

  1. 对于每一个硬币,都选择尽量多的使用,直到超过目标金额。

  2. 重复这个过程,直到凑出了目标金额。

代码:

python 复制代码
def greedy_coin_change(coins, target_amount):
    coins.sort(reverse=True)  # 面额大的硬币排在前面
    change = []
    remaining_amount = target_amount

    for coin in coins:
        while remaining_amount >= coin:
            change.append(coin)
            remaining_amount -= coin

    if remaining_amount == 0:
        return change
    else:
        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)

问题描述:

在这个问题中,我们有一系列活动,每个活动都有一个开始时间和结束时间。我们的目标是选择最大数量的互不冲突的活动。

算法步骤:

  1. 将活动按结束时间从早到晚排序。
  2. 选择第一个活动。
  3. 从剩余的活动中选择第一个与前一个已选活动不冲突的活动。
  4. 重复步骤3,直到没有更多的活动可选。

代码:

python 复制代码
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_time

    return 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)

在这个例子中,我们按照活动的结束时间进行排序,并选择尽量早结束的活动。这样就能够安排更多的互不冲突的活动。这是一个典型的贪心算法应用。贪心算法在活动选择问题上表现得很好,因为每次选择都是局部最优的。

结论:

贪心算法是一个直接、简单、好用的算法。

相关推荐
青 春 记 忆3 小时前
LeetCode 21. 合并两个有序链表|Python 解法详解
python·算法·leetcode·链表
大数据魔法师5 小时前
DuckDB高阶实战指南!多文件处理、窗口函数、性能调优、工程化落地
python·数据分析
Sagittarius_A*6 小时前
后量子密码|通识认知 03|量子威胁辟谣:Grover 算法对对称密码的影响与误区
算法·信息安全·密码学·量子计算·pqc·后量子密码
Patrick在香港6 小时前
Python Docker镜像从1.2GB到89MB:多阶段构建的完整优化实录
java·python·docker·信息可视化·容器·数据分析·ai编程
上海安当技术6 小时前
敏感数据怎么防拖库?信封加密(DEK+KEK 二层密钥)架构设计与 Java 实战
java·开发语言·python
QAQo7T7 小时前
Python组蓝桥杯备赛超详细知识点总结笔记_排序算法篇
笔记·python·算法·蓝桥杯·排序算法
醉颜凉7 小时前
蓝桥杯2025年第十六届省赛真题-最大数字 Python题解
python·职场和发展·蓝桥杯
千里之行,始于足下sanhai7 小时前
P8686 [蓝桥杯 2019 省 A] 修改数组 - 数字魔法大冒险 题解
c++·算法·动态规划
小星星闪亮登场8 小时前
Codeforces Round 1115 ( Div. 2)
数据结构·c++·算法·贪心算法·排序算法·codeforces
计算机小白一个8 小时前
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
java·数据结构·算法·蓝桥杯