贪心法经典问题练习


贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。请注意,贪心算法并不总是能找到全局最优解,但在某些问题上非常有效。下面是一些使用贪心方法解决的经典问题及其练习:

1. 活动安排问题

问题描述: 给定一系列活动,每个活动都有开始时间和结束时间,要求选择最多的互不冲突的活动集合。

贪心策略: 按照活动的结束时间从小到大排序,每次选择结束最早的活动加入集合,保证了下一个活动不会与已选择的活动冲突。

练习: 假设你有以下活动集合,每个活动用(start_time, end_time)表示,请找出最多能参加几个活动,并列出这些活动。

  • (1, 4)
  • (3, 5)
  • (0, 6)
  • (5, 7)
  • (3, 8)
  • (5, 9)
  • (6, 10)

2. 硬币找零问题

问题描述: 给定不同面额的硬币和一个总金额,求出最少数量的硬币组合来达到总金额。

贪心策略: 每次选择最大面额的硬币,如果超过了剩余金额,则选择次大的,依此类推,直到达到总金额。

练习: 假设你有硬币面额为[1, 5, 10, 25]美分,需要找零77美分,用贪心算法计算最少需要多少枚硬币以及具体的组合。

3. 霍夫曼编码

问题描述: 为一组字符设计一种前缀编码(没有字符的编码是另一个字符编码的前缀),使得编码后的字符串总长度最短。

贪心策略: 每次从频率最低的两个字符构建一个新的节点,并将其频率设置为这两个字符频率之和,重复此过程直到只剩下一个节点(树的根)。

练习: 设计一组字符及其出现频率(例如,‘A’: 5, ‘B’: 9, ‘C’: 12, ‘D’: 13),使用霍夫曼编码方法构建编码树,并给出每个字符的编码。

继续探索贪心算法的实践,这里再提供几个额外的练习题目,涵盖不同的应用场景,帮助您加深理解:

4. 文件合并问题

问题描述: 有多个日志文件,每个文件有一个读取开销(比如硬盘寻道时间)和文件大小。现在要将这些文件合并成一个文件,每次只能合并两个文件,合并后的文件会立即写入磁盘并取代原有的两个文件,求最小化整个合并过程的总开销(即每次合并的读取开销加上合并后的文件大小)。

贪心策略: 每次合并最小读取开销的两个文件。

练习: 假设有如下文件列表,每个元组代表(文件大小, 读取开销):

  • (5GB, 5分钟)
  • (3GB, 3分钟)
  • (8GB, 2分钟)
  • (1GB, 1分钟)

请计算最小总开销的合并顺序和总开销。

5. 任务调度问题

问题描述: 有一系列独立的任务,每个任务有一个完成时间,需要在单个处理器上执行。目标是确定任务的执行顺序,使得所有任务完成的总时间(最后一个任务完成的时间)最小。

贪心策略: 按照任务的完成时间从短到长排序,依次执行。

练习: 假设有以下任务及其预计完成时间(单位:分钟):

  • 任务A: 3分钟
  • 任务B: 8分钟
  • 任务C: 5分钟
  • 任务D: 2分钟

请确定任务的最优执行顺序及完成所有任务所需的最短时间。

6. 分数背包问题

问题描述: 有一个背包容量为W,以及n件物品,每件物品i有一个重量wi和一个价值vi,求解如何选择物品装入背包,使得总价值最大,但总重量不超过背包容量。

贪心策略: 按照物品的价值密度(vi/wi)从高到低排序,优先选择价值密度高的物品装入背包,直到背包装满。

练习: 假设背包容量为15kg,有以下物品:

  • 物品1: 重量10kg,价值60元
  • 物品2: 重量4kg,价值40元
  • 物品3: 重量5kg,价值50元

请计算最大总价值以及选择哪些物品装入背包。

这些练习覆盖了贪心算法在不同问题中的应用,通过解决它们,您可以进一步掌握贪心算法的核心思想和适用场景。

解答上述练习

1. 活动安排问题

解答:
首先,我们将活动按照结束时间从小到大排序:

  • (1, 4)
  • (3, 5)
  • (0, 6)
  • (5, 7)
  • (3, 8)
  • (5, 9)
  • (6, 10)

选择活动的策略是尽量选择结束时间早的活动,一旦选择了某个活动,接下来只能选择结束时间在其之后的活动。按照这个策略,我们可以选择以下活动:

  • 首先选择(1, 4),接下来可以选择(3, 5)(与(0, 6)相比,尽管开始时间更晚,但结束时间更早,更优)。
  • 接下来不能选择(0, 6),因为它与之前选择的活动冲突。
  • 可以选择(5, 7),因为它在(3, 8)和(5, 9)之前结束。
  • 然后是(6, 10),因为它在(5, 9)之后开始。

所以,最多能参加的活动数是4个,分别是:(1, 4), (3, 5), (5, 7), 和(6, 10)。

2. 硬币找零问题

解答:
对于77美分找零,使用硬币面额[1, 5, 10, 25]美分的贪心策略:

  • 首先,尽量使用最大面额的硬币,即25美分,可以使用3枚,这样剩下2美分。
  • 剩下的2美分直接用1美分的硬币。

所以,最少需要的硬币数是3(25美分硬币)+ 1(1美分硬币)= 4枚硬币。

3. 霍夫曼编码

解答:
对于给定字符及其频率(‘A’: 5, ‘B’: 9, ‘C’: 12, ‘D’: 13),构建霍夫曼树并给出编码:

  1. 初始化:将每个字符看作一个叶子节点,以其频率为权重。
  2. 构建过程
    • 首先取频率最低的两个节点,即’A’和’B’,合并得到新节点,频率为5+9=14,标记为E。
    • 现在频率最低的节点是’C’和’E’,合并得到新节点,频率为12+14=26,标记为F。
    • 接下来是’D’和’F’,合并,频率为13+26=39,标记为G。
    • G现在是唯一的节点,成为树的根。

编码规则:从根到叶子的路径上,左分支代表0,右分支代表1。

  • 'A’的编码为从E到A的路径,即0。
  • 'B’的编码为从E到B的路径,即1。
  • 'C’的编码为从F到C的路径,即00。
  • 'D’的编码为从G经过F到D的路径,即10。

所以,霍夫曼编码结果为:

  • A: 0
  • B: 1
  • C: 00
  • D: 10
4. 文件合并问题

解答:
首先,根据读取开销对文件进行排序:

  • (1GB, 1分钟)
  • (3GB, 3分钟)
  • (5GB, 5分钟)
  • (8GB, 2分钟)

注意,此处应先按读取开销排序,若读取开销相同,则按文件大小排序以避免误解。但在这个例子中,所有文件的读取开销都是唯一的,故直接按开销排序即可。

  • 第一次合并最小的两个文件(1GB, 1分钟)和(3GB, 3分钟),合并成本为1+1+3=5分钟,生成一个新文件(4GB, 5分钟)。
  • 接下来合并剩余文件中最小的两个(新生成的4GB, 5分钟)和(5GB, 5分钟),成本为5+5+5=15分钟,生成一个新文件(9GB, 15分钟)。
  • 最后合并(8GB, 2分钟)和(9GB, 15分钟),成本为2+15+9=26分钟,生成最终文件(17GB, 26分钟)。

所以,最小总开销为26分钟。

5. 任务调度问题

解答:
按任务完成时间从短到长排序:

  • 任务D: 2分钟
  • 任务A: 3分钟
  • 任务C: 5分钟
  • 任务B: 8分钟

最优执行顺序为D->A->C->B。执行过程如下:

  • 首先执行D,耗时2分钟,累计2分钟。
  • 然后执行A,再过3分钟,累计5分钟。
  • 接着执行C,再过5分钟,累计10分钟。
  • 最后执行B,再过8分钟,累计18分钟。

所有任务完成的最短时间为18分钟。

6. 分数背包问题

解答:
按价值密度从高到低排序物品:

  • 物品2: 价值密度 = 40/4 = 10元/kg
  • 物品3: 价值密度 = 50/5 = 10元/kg
  • 物品1: 价值密度 = 60/10 = 6元/kg

按照贪心策略,优先选择价值密度高的物品:

  • 首先选择物品2(4kg, 40元),背包剩余容量11kg。
  • 然后选择物品3(5kg, 50元),但此时背包仅剩11kg,不足以装入,因此选择部分装入(实际装入物品3的4kg部分,价值为40元),背包剩余容量变为7kg。
  • 最后选择物品1(10kg, 60元),因背包剩余容量只有7kg,无法装入,所以不选择物品1。

最终,背包中装入了物品2和物品3的部分,总价值为40元+40元=80元。

这些解答展示了贪心策略在不同问题上的应用,以及如何通过简单的步骤逐步找到最优或近似最优解。
以上是针对各个问题的解答和分析,希望对你有所帮助。

7. 硬币找零问题

解答:
假设我们有硬币面额为 {1, 5, 10, 25} 分。目标是用最少数量的硬币找零67分。

采用贪心策略,每次尽可能选择最大面额的硬币进行分配:

  • 首先尝试使用25分的硬币,(67 \div 25 = 2) 余 (17),因此使用2个25分硬币,剩余17分。
  • 接下来选择10分的硬币,(17 \div 10 = 1) 余 (7),使用1个10分硬币,剩余7分。
  • 然后选择5分的硬币,(7 \div 5 = 1) 余 (2),使用1个5分硬币,剩余2分。
  • 最后,用2个1分的硬币补足剩余的2分。

最终使用的硬币数为2(25分) + 1(10分) + 1(5分) + 2(1分) = 6枚硬币。

请注意,硬币找零问题在某些情况下贪心策略可能不会得到最优解,但在这个特定的 coin denominations 和目标金额下,贪心策略恰好给出最优解。

8. 活动选择问题

问题重述: 假设有一系列会议,每个会议都有开始时间和结束时间。选择最多的会议数量,使得任意两个会议之间没有时间重叠。

解答示例:
假设会议安排如下(开始时间, 结束时间):

  1. (1, 3)
  2. (2, 4)
  3. (3, 5)
  4. (5, 7)
  5. (6, 8)

按照结束时间从小到大排序:

  1. (1, 3)
  2. (2, 4)
  3. (3, 5)
  4. (5, 7)
  5. (6, 8)

采用贪心策略,每次选择结束时间最早的未冲突会议:

  • 首先选择会议1,因为它是最早结束的。
  • 接着会议2与会议1冲突,跳过。
  • 选择会议3,因为它在会议1结束后开始。
  • 会议4在会议3结束后开始,选择会议4。
  • 会议5与会议4冲突,跳过。

因此,根据贪心策略选择的会议是1, 3, 和 4,共3场会议可以无冲突地举行。

以上解答展示了贪心策略在解决活动选择问题时的应用,通过排序和逐个选择来达到最大化目标(在此例中是会议的数量)。

😍😍 大量H5小游戏、微信小游戏、抖音小游戏源码😍😍
😍😍试玩地址: https://www.bojiogame.sg😍😍
😍看上哪一款,需要源码的csdn私信我😍

————————————————

​最后我们放松一下眼睛
在这里插入图片描述

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极致人生-010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值