Python学习笔记:4.2.3 背包问题

本文是学习陆老师的《python全栈工程师 - 数据结构与算法》课程的笔记,欢迎学习交流。同时感谢陆老师的精彩传授!

一、课程目标
  • 什么是背包问题
  • 贪心算法
  • 动态规划
二、详情解读
01.什么是背包问题:

限定条件下获得最大价值

比如:你现在有一个背包,只能背1kg的物品,可以背的物品包括:
1.笔记本电脑,重0.9kg,价值8000元
2.蓝牙音箱,重0.7kg,价值3000元
3.虚拟设备,重0.3kg, 价值1500元
怎么装,可以让背包里的物品总价值最大

类似的问题 – 资源配置收益最大化

比如:七天长假,你如何用有限的时间去多玩几天最想去的地方(0-1背包问题,每一种选择只能选择一次)
比如:集装箱装船,有不同的集装箱规格,如何在总质量不超过载重的情况,尽量装满货船(完全背包问题,每一种选择可以选择多次)

02. 0-1背包问题:贪心算法求解

贪心算法求解

1.贪心算法就是不管全局,只管眼前
2.找出当前的最优解就好
3.贪心算法找到的结果不一定是最好的解

举例:去电脑商场偷电脑,背的包最多装1000克

1.笔记本电脑:重500克,价值11000元
2.音箱:重400克,价值6000元
3.ipad:重300克,价值7000元
4.手机:重200克,价值3000元
5.触摸笔:重100克,价值1000元

Python学习笔记:4.2.3 背包问题_第1张图片
代码实现:

goods_list = {
   
  'notebooks': (800, 10000),
  'voicebox': (600, 6000),
  'ipad': (300, 7000),
  'mobile': (200, 1500),
  'pencil': (100, 2000)
}

allow_weight = 1000

# 价格最大化
take_goods = []
take_weight = 0
while take_weight < allow_weight:
  max_price = 0
  max_price_goods = None
  for goods_name, goods_nature in goods_list.items():
    if goods_name in take_goods:
      continue
    if max_price < goods_nature[1]:
      if goods_nature[0] <= allow_weight - take_weight:
        max_price = goods_nature[1]
        max_price_goods = goods_name
  if max_price_goods:
    take_goods.append(max_price_goods)
    take_weight += goods_list[max_price_goods][0]
  else:
    break

print('按照价格最大化选择:', take_goods, take_weight

你可能感兴趣的:(Python全栈工程师学习笔记,python,动态规划,背包问题,贪心算法)