背包问题

背包问题

一个小偷在某个商店发现有n个商品,第i个商品价值vi元,重w;千克。他希望拿走的价值尽量高,但他的背包最多只能容纳W千克的东西。他应该拿走哪些商品?

问题思路:每次拿性价比最高的东西,即v/w价值最大的东西,拿满之后拿第二价值高的东西,以此类推

分数背包:对于一个商品,小偷可以拿走其中任意一部分。

# 分数背包问题

goods = [(60, 10),(100, 20),(120, 30)]  # 每个商品元组表示(价格,重量)
goods.sort(key=lambda x: x[0]/x[1], reverse=True)  # 将商品按照性价比排序

def fractional_backpack(goods, w):  # w为背包容量
    m = [0 for _ in range(len(goods))]
    total_val = 0  # 总价值
    for i, (prize, weight) in enumerate(goods):
        if w >= weight:  # 背包的容量大于商品的重量
            m[i] = 1
            total_val += prize  # 计算价值
            w -= weight  # 更新剩余容量
        else:   # 如果不是整个
            m[i] = w / weight
            total_val += m[i] * prize
            w = 0
            break
    return m, total_val

print(fractional_backpack(goods, 50))

 

posted @ 2023-06-16 20:33  天才九少  阅读(16)  评论(0)    收藏  举报