Python ---- 算法入门(1)贪心算法解决部分背包问题

1. 题目

假设商店中有 4 种商品,它们各自的重量和收益是:

  1. 商品 1:重量 20 斤,收益 100 元;
  2. 商品 2:重量 10 斤,收益 60 元;
  3. 商品 3:重量 40 斤,收益 100 元;
  4. 商品 4:重量 30 斤,收益 120 元;

对于每件商品,顾客可以购买商品的一部分(可再分)。一个小偷想到商店行窃,他的背包最多只能装 50 斤的商品,如何选择才能获得最大的收益呢?

2. 解决问题的思路【贪心算法】

  1. 贪心算法是每一步都追求最优的解决方案
  2. 如何选择是最优的商品?【计算每个商品的收益率(收益/重量)】
  3. 使用贪心算法进行选择!【优先选择收益率最大的商品】
  4. 解决最终问题装够50斤!【直至所选商品的总重量达到 50 斤】

注意:虽然贪心算法每一步都是最优的解决方案,但整个算法并不一定是最优的。

3. 初始化背包大小和商品列表

# 背包可装总重量
w =50
# 所有商品信息列表
goods_info = [
    {'name': 'goods1','weight': 20, 'profit': 100},
    {'name': 'goods2','weight': 10, 'profit': 60},
    {'name': 'goods3','weight': 40, 'profit': 100},
    {'name': 'goods4','weight': 30, 'profit': 120},
  ]

4. 计算各种商品的收益率

# 计算每个商品的收益率
def get_earning_rate(goods):
  for item in goods:
    rate = item['profit'] / item['weight']
    item['rate'] = rate

5. 比较收益率大小排序,最优商品到最差商品

# 对商品收益率排序【降序】,收益率从高到低
goods_info.sort(key=lambda a: a["rate"],reverse=True)

6. 计算每种商品装的量和对应量的价值

# 计算每种商品装的量和对应量的价值
def get_goods_result_and_value(w, goods_info):
  for item in goods_info:
    current_goods_weight = item['weight']
    current_weight = min(w, current_goods_weight)
    result = current_weight / current_goods_weight
    item['result'] = result
    item['value'] = result * item['profit']
    w = w - current_weight

7. 输出每种商品的装入量

# 输出每种商品的装入量
def get_print_result(goods_info):
  for item in goods_info:
    result = item['result']
    if result == 1:
      print("总重量为 %.2f,总价值为 %.2f 的商品全部装入"%(item['weight'],item['profit']))
    elif result == 0:
      print("总重量为 %.2f,总价值为 %.2f 的商品不装"%(item['weight'],item['profit']))
    else:
      print("总重量为 %.2f,总价值为 %.2f 的商品装入%.2f%%"%(item['weight'],item['profit'],item['result']*100))

8. 最终收获的商品价值

print("最终收获的商品价值为:%.2f" %(sum([item['value'] for item in goods_info])))

9. 贪心算法解决部分背包问题的完整代码

'''
Descripttion: 
version: 1.0.0
Author: Rattenking
Date: 2022-07-12 14:13:34
LastEditors: Rattenking
'''

# 计算每个商品的收益率
def get_earning_rate(goods):
  for item in goods:
    rate = item['profit'] / item['weight']
    item['rate'] = rate

# 计算每种商品装的量和对应量的价值
def get_goods_result_and_value(w, goods_info):
  for item in goods_info:
    current_goods_weight = item['weight']
    current_weight = min(w, current_goods_weight)
    result = current_weight / current_goods_weight
    item['result'] = result
    item['value'] = result * item['profit']
    w = w - current_weight

# 输出每种商品的装入量,返回价值列表
def get_print_result(goods_info):
  for item in goods_info:
    result = item['result']
    if result == 1:
      print("总重量为 %.2f,总价值为 %.2f 的商品全部装入"%(item['weight'],item['profit']))
    elif result == 0:
      print("总重量为 %.2f,总价值为 %.2f 的商品不装"%(item['weight'],item['profit']))
    else:
      print("总重量为 %.2f,总价值为 %.2f 的商品装入%.2f%%"%(item['weight'],item['profit'],item['result']*100))

if __name__ == '__main__':
  # 背包可装总重量
  w = 50
  # 所有商品信息列表
  goods_info = [
    {'name': 'goods1','weight': 20, 'profit': 100},
    {'name': 'goods2','weight': 10, 'profit': 60},
    {'name': 'goods3','weight': 40, 'profit': 100},
    {'name': 'goods4','weight': 30, 'profit': 120},
  ]

  # 计算每个商品的收益率
  get_earning_rate(goods_info)
  
  # 对商品收益率排序【降序】,收益率从高到低
  goods_info.sort(key=lambda a: a["rate"],reverse=True)

  # 计算每种商品装的量和对应量的价值
  get_goods_result_and_value(w, goods_info)
  
  # 输出每种商品的装入量,返回价值列表
  get_print_result(goods_info)

  # 输出最终的商品获益价值
  print("最终收获的商品价值为:%.2f" %(sum([item['value'] for item in goods_info])))

10. 最终输出结果

在这里插入图片描述

WXRUI体验二维码

WXRUI体验码

下载

我的博客,欢迎交流!

我的CSDN博客,欢迎交流!

微信小程序专栏

前端笔记专栏

微信小程序实现部分高德地图功能的DEMO下载

微信小程序实现MUI的部分效果的DEMO下载

微信小程序实现MUI的GIT项目地址

微信小程序实例列表

前端笔记列表

游戏列表

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Rattenking

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

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

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

打赏作者

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

抵扣说明:

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

余额充值