算法设计与分析--贪心算法

  1. 设有n个货物要装入若干个容量为C的集装箱以便运输,这n个货物的体积分别是{S1, S2, …, Sn},且有si<C(1≤i≤n)。为节省运输成本,用尽可能少的集装箱为装运这n个货物。分别采用以下两种贪心策略对其进行求解:
  • 最先适宜策略(firstfit):首先将所有的集装箱初始化为空,对于所有货物,按照所给的次序,每次将一个货物装入第一个能容纳它的集装箱中;
  • 最优适宜策略(bestfit):总是把货物装到能容纳它,且目前剩余容量最小的集装箱中,使得该箱子装入货物后闲置空间最小。

   分别实现上述两个策略。

提示:

  1. 输入n个货品的体积,以及每个集装箱的大小C
  2. 输出两种策略下需要的集装箱个数

对最先适宜策略,每次放新货物,从已装的箱子中依次搜索能容纳货物的箱子,找到合适的立马装上并进行下一个货物的装放;对最优适宜策略,每次放新货,都要对所有

### 关于头歌平台《算法设计分析》课程中的贪心算法 贪心算法是一种通过一系列局部最优的选择来构建全局最优解的方法。它从问题的一个初始状态出发,按照某种既定的策略逐步推进,直到无法再继续为止[^1]。这种方法的核心在于其每一步决策都是基于当前状态下能够获得的最大收益或最小代价。 #### 头歌平台上的课程特点 在头歌平台上,《算法设计分析》课程通常会详细介绍贪心算法设计思路及其适用场景。具体来说: - **定义基本思想** 贪心算法的基本思想是以逐步的局部最优选择为目标,从而达到最终的全局最优解[^1]。这种算法适用于具有最优子结构性质的问题,即整体问题的最优解可以通过子问题的最优解组合而成[^2]。 - **典型应用案例** - **背包问题(物品可分割)** 对于允许物品分割的情况,贪心算法可以根据单位重量的价值对物品进行排序,并优先选取价值密度最高的物品填充背包[^3]。 - **最小生成树问题** 使用Kruskal算法或Prim算法时,均采用了贪心的思想,每次选择权重最小的边加入生成树集合,直至形成一棵完整的树[^2]。 - **哈夫曼编码** 构建前缀码的过程中也体现了贪心原则,通过对频率较低字符赋予较短路径的方式减少总编码长度[^2]。 - **局限性讨论** 尽管贪心算法效率高且结果接近最优,但它并不总是能提供完全正确的解决方案。例如,在0-1背包问题中,由于物品不可分割,单纯依赖贪心策略可能会导致次优甚至错误的结果[^3]。 #### 学习建议 为了更好地掌握头歌平台上的相关内容,可以从以下几个方面入手: 1. 理解并记忆贪心算法的关键特性——最优子结构性质和无后效性; 2. 结合实际例子练习如何制定合理的贪心准则; 3. 探讨哪些经典问题是适合采用此方法求解的,又有哪些例外情况需要注意规避。 以下是实现部分典型案例的Python代码示例: ```python def knapsack_fractional(weights, values, capacity): n = len(values) ratio = [(v / w, w) for v, w in zip(values, weights)] ratio.sort(reverse=True) total_value = 0 remaining_capacity = capacity for value_per_weight, weight in ratio: if weight <= remaining_capacity: total_value += value_per_weight * weight remaining_capacity -= weight else: fraction = remaining_capacity / weight total_value += value_per_weight * fraction break return total_value weights = [10, 20, 30] values = [60, 100, 120] capacity = 50 print(knapsack_fractional(weights, values, capacity)) # 输出最大价值 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值