贪心算法适用于找零、活动选择、分数背包、霍夫曼编码和区间调度五类优化问题,分别通过面额降序选取、结束时间升序贪心、单位价值密度排序、最小频率合并及扫描线计数实现。

如果需要在PHP中解决某些优化问题,例如找零、活动选择或最小生成树等,贪心算法提供了一种局部最优解逐步构造全局解的策略。以下是几种典型应用场景及其对应实现方法:
一、找零问题(硬币最少数量)
该方法适用于硬币面额为标准货币系统(如1、5、10、25美分)时,通过每次选取最大可行面额来最小化硬币总数。
1、定义一个按降序排列的硬币面额数组,例如[25, 10, 5, 1]。
2、初始化空结果数组和剩余金额变量,将输入金额赋值给剩余金额。
3、遍历硬币面额数组,对每个面额执行:当剩余金额大于等于当前面额时,将该面额加入结果数组,并从剩余金额中减去该面额。
4、返回结果数组,其长度即为所需最少硬币数。
二、活动选择问题(最多不重叠活动)
该方法用于从一组具有开始与结束时间的活动中选出最大兼容子集,核心是按结束时间升序排序后贪心选取。
1、将活动数组按结束时间字段进行升序排序,可使用usort配合自定义比较函数。
2、初始化结果数组,将首个活动(最早结束者)加入其中,并记录其结束时间为last_end。
3、从第二个活动开始遍历,对每个活动判断其开始时间是否大于等于last_end。
4、若满足条件,则将该活动加入结果数组,并更新last_end为其结束时间。
三、分数背包问题(非0-1背包)
该方法适用于物品可分割场景,通过单位价值密度排序,优先装入价值密度最高的物品部分,以最大化总价值。
1、计算每个物品的单位重量价值(value/weight),并以此为依据对物品数组降序排序。
2、初始化当前总重量为0、总价值为0,设定背包容量上限。
3、遍历排序后的物品数组,对每个物品判断:若其重量小于等于剩余容量,则全部装入,更新总重量与总价值。
4、否则,仅装入剩余容量允许的部分重量,按比例计算对应价值并累加,随后终止循环。
四、霍夫曼编码构建(最小加权路径长)
该方法用于构造最优前缀码,通过反复合并频率最低的两个节点,生成带权路径长度最小的二叉树。
1、将所有字符及其频率构造成最小堆(可用SplMinHeap或手动维护数组堆结构)。
2、当堆中节点数大于1时,连续弹出两个频率最小的节点,创建新父节点,其频率为二者之和,并将两节点作为左右子节点。
3、将新父节点插入堆中。
4、重复步骤2–3直至堆中只剩一个节点,该节点即为霍夫曼树根节点。
五、区间调度最小资源数(会议室安排)
该方法用于确定处理所有区间所需的最少资源数,本质是求区间图的最大团大小,可通过扫描线法配合贪心计数实现。
1、分别提取所有区间的开始时间和结束时间,标记类型(start/end),合并为事件数组。
2、对事件数组按时间升序排序;若时间相同,则end事件排在start事件之前。
3、初始化当前占用资源数和最大资源数均为0。
4、遍历事件数组:遇start事件则当前数加1,并更新最大资源数;遇end事件则当前数减1。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











