Python ---- 算法入门(1)贪心算法解决部分背包问题
算法,Python,----,入门,贪心,解决,部分,背包,问题
2025-03-25 08:59:26 时间
1. 题目
假设商店中有 4 种商品,它们各自的重量和收益是:
- 商品 1:重量 20 斤,收益 100 元;
- 商品 2:重量 10 斤,收益 60 元;
- 商品 3:重量 40 斤,收益 100 元;
- 商品 4:重量 30 斤,收益 120 元;
对于每件商品,顾客可以购买商品的一部分(可再分)。一个小偷想到商店行窃,他的背包最多只能装 50 斤的商品,如何选择才能获得最大的收益呢?
2. 解决问题的思路【贪心算法】
- 贪心算法是每一步都追求最优的解决方案;
- 如何选择是最优的商品?【计算每个商品的收益率(收益/重量)】
- 使用贪心算法进行选择!【优先选择收益率最大的商品】
- 解决最终问题装够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. 最终输出结果
相关文章
- python pycharm教程_Pycharm简单使用教程(入门小结)
- Python 极速入门教程
- [Elasticsearch]如何通过python操作ES数据库 pythonElasticsearch入门
- 入门Python,看完这篇就行了!
- Python入门到进阶课程推荐,免费课程一键领取
- Python入门:Anaconda和Pycharm的安装和配置
- Pycharm入门使用教程(for python)「建议收藏」
- Python该怎么入门?Python入门教程(非常详细)「建议收藏」
- mac pycharm安装设置_入门python,这样操作,简单易学(安装教程)「建议收藏」
- Python入门-虚拟环境
- pycharm和python idle区别_python新手入门使用自带的IDLE、用pycharm还是visual studio ?…[通俗易懂]
- python基础教程 入门教程_python基础入门教程
- Python从入门到进阶之六:Pycharm中如何加入代理