背包问题
背包问题
一个小偷在某个商店发现有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))

浙公网安备 33010602011771号