贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最优决策的算法思想。它通过局部最优的选择,希望最终达到全局最优解。贪心算法并不总是能得到全局最优解,但在某些问题上非常有效。
1. 贪心算法的核心思想
- 局部最优:在每一步选择中,选择当前状态下最优的决策。
- 无后效性:当前的选择不会影响后续的选择。
- 贪心选择性质:通过局部最优选择,最终能够得到全局最优解。
2. 贪心算法的适用条件
贪心算法适用于满足以下条件的问题:
- 最优子结构:问题的最优解包含子问题的最优解。
- 贪心选择性质:通过局部最优选择,能够得到全局最优解。
3. 贪心算法的经典问题
1. 找零问题
- 问题描述:给定不同面额的硬币和一个总金额,求最少需要多少硬币。
- 贪心策略:每次选择面额最大的硬币。
- 代码实现:
int coinChange(vector<int>& coins, int amount) { sort(coins.rbegin(), coins.rend()); // 按面额从大到小排序 int count = 0; for (int coin : coins) { while (amount >= coin) { amount -= coin; count++; } } return amount == 0 ? count : -1; // 如果无法凑出金额,返回 -1 }
2. 活动选择问题
- 问题描述:给定一组活动,每个活动有开始时间和结束时间,求最多能安排多少个互不冲突的活动。
- 贪心策略:每次选择结束时间最早的活动。
- 代码实现:
int maxActivities(vector<pair<int