什么是贪心算法?

贪心算法(Greedy Algorithm) 是一种算法策略,它在求解问题时,每一步都选择当前**最优(局部最优)**的解,希望最终能得到全局最优解。

🔹 关键特点:

  1. 贪心选择(Greedy Choice):每一步都做出局部最优的选择。
  2. 无后效性(No Aftereffect):当前选择不会影响后续的选择。
  3. 最优子结构(Optimal Substructure):局部最优解能够构造全局最优解。

⚠️ 注意:贪心算法并不总是能得到最优解,但对于某些问题(如最小生成树、活动安排、背包问题等),贪心算法能高效地求解最优解。

 

C# 代码示例:贪心算法求解“零钱找零问题”

问题描述

假设商店要找零 amount 元,硬币的面值有 {1, 5, 10, 25, 50}(美分)。
要求:用最少数量的硬币找零。

贪心策略

  • 每次都选择当前最大面值的硬币,直到总额满足 amount

C# 代码(贪心找零)

using System;
using System.Collections.Generic;

class GreedyChange
{
public static void Main()
{
int amount = 87; // 需要找零 87 美分
int[] coins = { 50, 25, 10, 5, 1 }; // 硬币面值(已按降序排列)

List<int> result = GetChange(amount, coins);

Console.WriteLine($"找零 {amount} 美分的最少硬币组合:");
foreach (var coin in result)
{
Console.Write(coin + " ");
}
}

static List<int> GetChange(int amount, int[] coins)
{
List<int> result = new List<int>();

foreach (var coin in coins)
{
while (amount >= coin) // 选择当前面值最大的硬币
{
amount -= coin;
result.Add(coin);
}
}

return result;
}
}


运行结果

 
找零 87 美分的最少硬币组合: 50 25 10 1 1

解释:87 美分,贪心算法的选择是:

  • 50 美分 × 1
  • 25 美分 × 1
  • 10 美分 × 1
  • 1 美分 × 2 总共 5 枚硬币

总结

  • 贪心算法适用于找零问题,因为每次选择最大面值的硬币不会影响最终最优解
  • 时间复杂度:O(n),其中 n 是硬币种类数,效率很高。

🚀 贪心算法适用于一些优化问题,如最短路径、活动选择、哈夫曼编码等,但不是所有问题都能保证最优解!

posted @ 2025-02-10 16:15  MaxBruce  阅读(148)  评论(0)    收藏  举报