贪心算法:原理、应用及Python代码实现
### 💡贪心算法定义 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。它并不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解。 ### 🌟贪心算法基本要素 - **贪心选择性质**:指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。 - **最优子结构性质**:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用贪心算法求解的关键特征。 ### 📝贪心算法的步骤 1. 建立数学模型来描述问题。 2. 把求解的问题分成若干个子问题。 3. 对每一子问题求解,得到子问题的局部最优解。 4. 把子问题的解局部最优解合成原来解问题的一个解。 ### 🎯贪心算法的应用场景 - **活动选择问题**:假设有多个活动,每个活动有开始时间和结束时间,要求在一段时间内安排尽可能多的活动,且活动之间不能冲突。可以按照活动的结束时间对活动进行排序,然后依次选择结束时间最早且与已选择的活动不冲突的活动。 - **背包问题**:在一定容量的背包中选择物品,每个物品有重量和价值,目标是使背包中物品的总价值最大。如果是部分背包问题(物品可以分割),可以通过计算每个物品的单位重量价值,按单位重量价值从高到低的顺序选择物品放入背包。 ### 🐍Python代码示例(活动选择问题) ```python def activity_selection(start, end): n = len(start) activities = [] # 将活动的开始时间、结束时间和活动编号组合在一起 for i in range(n): activities.append((start[i], end[i], i)) # 按活动的结束时间进行排序 activities.sort(key=lambda x: x[1]) selected_activities = [] # 选择第一个活动 selected_activities.append(activities[0][2]) last_end_time = activities[0][1] # 遍历剩余的活动 for i in range(1, n): if activities[i][0] >= last_end_time: selected_activities.append(activities[i][2]) last_end_time = activities[i][1] return selected_activities # 测试 start_times = [1, 3, 0, 5, 8, 5] end_times = [2, 4, 6, 7, 9, 9] result = activity_selection(start_times, end_times) print("选择的活动编号:", result) ``` ######[AI问答 | 675点数解答 | 2026-03-28 16:05:35]
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)465
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)346
- 探秘 Linux sensors 原理:从硬件读取到数据监测的全面剖析(GPT | 407点数解答 | 2024-10-21 16:06:25)263
- Express 应用创建与数据查询 API 实现:附代码示例与注意要点(字节豆包 | 387点数解答 | 2024-12-05 09:09:59)226
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)418
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)412
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)316
- Python 在 Windows 系统下编程实现 RSA 算法对照片加密与解密(字节豆包 | 373点数解答 | 2025-01-05 18:35:28)363
- Python 在 Windows 系统下编程实现 RSA 算法对照片加密与解密:附代码及注意事项(GPT | 1269点数解答 | 2025-01-05 18:37:09)246
- Python在Windows系统下实现RSA算法对手写签名照片加密解密,附代码及关键逻辑 (GPT | 786点数解答 | 2025-01-05 18:37:20)308
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)466
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)357