华为OD机试真题-贪心的商人

举报
鱼弦 发表于 2024/10/18 09:34:53 2024/10/18
【摘要】 介绍"贪心的商人"是一个经典的贪心算法问题,常用于优化和决策问题中。问题通常描述为:给定一系列不同价值和重量的物品,如何在限定的总重量下选择物品以最大化总价值。这一问题可以抽象为 0-1 背包问题,但在某些约束条件下(如物品可被分割)可直接应用贪心策略。 应用使用场景资源分配:在有限资源下,如何最大化效益。物流和运输:最大化装载货物的价值。投资组合管理:在一定预算内选择收益最大化的投资项目...

介绍

"贪心的商人"是一个经典的贪心算法问题,常用于优化和决策问题中。问题通常描述为:给定一系列不同价值和重量的物品,如何在限定的总重量下选择物品以最大化总价值。这一问题可以抽象为 0-1 背包问题,但在某些约束条件下(如物品可被分割)可直接应用贪心策略。

应用使用场景

  • 资源分配:在有限资源下,如何最大化效益。
  • 物流和运输:最大化装载货物的价值。
  • 投资组合管理:在一定预算内选择收益最大化的投资项目。
  • 广告分配:根据预算选择最优广告投放策略。

原理解释

贪心算法是一种逐步构建解决方案的方法,通过每次选择当前最优解来生成全局最优解。其核心思想是对每个决策采用贪婪的选择,即只考虑局部最优解,而不追求全局最优解的整体情况。

算法原理流程图

+------------------------+
|    初始化问题数据      |
+-----------+------------+
            |
            v
+------------------------+
| 按价值密度降序排列物品 |
+-----------+------------+
            |
            v
+------------------------+
|   依次选择当前最优     |
|   (价值密度最高)物品   |
+-----------+------------+
            |
            v
+------------------------+
| 检查是否超过限制条件   |
+-----------+------------+
            |
            v
+------------------------+
|      输出最优解        |
+------------------------+

算法原理解释

  1. 初始化问题数据:收集所有物品的价值和重量。
  2. 排序:根据价值密度(即单位重量的价值)对物品进行降序排序。
  3. 选择物品:从价值密度最高的物品开始,尽可能选取直到达到重量限制。
  4. 检查与调整:如果重量限制已满但还有剩余空间,则可能需要调整部分选择。
  5. 输出结果:将选择的物品及其总价值作为输出。

实际详细应用

代码示例实现

def greedy_knapsack(values, weights, capacity):
    items = list(zip(values, weights))
    # 计算单位价值并排序
    items.sort(key=lambda item: item[0]/item[1], reverse=True)
    
    total_value = 0
    for value, weight in items:
        if capacity >= weight:
            # 如果容量足够,完全拿走
            total_value += value
            capacity -= weight
        else:
            # 否则,拿走部分
            total_value += (value/weight) * capacity
            break
    return total_value

# 示例物品价值和重量
values = [60, 100, 120]
weights = [10, 20, 30]
capacity = 50

max_value = greedy_knapsack(values, weights, capacity)
print(f'Maximum value in the knapsack can be: {max_value}')

测试代码

def test_greedy_knapsack():
    values = [60, 100, 120]
    weights = [10, 20, 30]
    capacity = 50
    assert greedy_knapsack(values, weights, capacity) == 240.0
    
    values = [10, 20, 30]
    weights = [5, 10, 15]
    capacity = 20
    assert greedy_knapsack(values, weights, capacity) == 40.0

test_greedy_knapsack()

部署场景

该算法适用于任何需要快速做出接近最优解决策的场合,尤其是在资源有限且要求效率高的情况下。可以嵌入到库存管理系统、自动化物流调度系统等。

材料链接

总结

贪心算法提供了一种在资源受限情况下的有效决策方法,其局限性在于它不能保证全局最优解,但在诸多实际场景中,它的简单性和高效性使它成为一种实用工具。

未来展望

随着机器学习和人工智能技术的发展,贪心算法有望与这些新技术结合,提高其应用范围和解决复杂问题的能力,特别是在动态环境中进行实时决策时。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。