3.2_backpack_背包问题

本文详细解析了背包问题中的两种关键变种——分数背包,通过商品价值与重量的优化选择;以及0-1背包,探讨如何在有限容量下最大化收益。通过实例演示和代码实现,帮助理解这两种在实际问题中广泛应用的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--- 背包问题 ---
    综合考虑价格和重量

1. 分数背包
2. 0-1背包

 1. 分数背包

# (价值, 重量)
goods = [(60, 10), (100, 20), (120, 30)]
goods.sort(key=lambda x: x[0] / x[1], reverse=True)


def fractional_backpack(goods, w):
    """分数背包"""

    m = [0 for _ in range(len(goods))]
    total_v = 0

    for i, (price, weight) in enumerate(goods):
        if w >= weight:
            m[i] = 1
            total_v += price
            w -= weight
        else:
            m[i] = w / weight
            total_v += m[i] * price
            w = 0
            break
    return f'拿走 {m},总价值: {total_v}'

 2. 0-1背包

tr = [None, {'w': 2, 'v': 3}, {'w': 3, 'v': 4}, {'w': 4, 'v': 8}, {'w': 5, 'v': 8}, {'w': 9, 'v': 10}]


def backpack_01(tr, max_w):
    """0-1背包"""

    # 初始化背包:前 i 个宝物中,最大价值为 w
    m = {(i, w): 0 for i in range(len(tr)) for w in range(max_w + 1)}

    for i in range(1, len(tr)):
        for w in range(1, max_w + 1):
            # 装不下第 i 个宝物,就不装
            if tr[i]['w'] > w:
                m[(i, w)] = m[(i - 1, w)]
            else:
                # 取最大值:不装第 i 个宝物 / 装第 i 个宝物
                m[(i, w)] = max(m[(i - 1, w)], m[(i - 1, w - tr[i]['w'])] + tr[i]['v'])

    return m[(len(tr) - 1, max_w)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值