部分背包问题(python)

1469: 部分背包问题

题目描述

给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,背包的容量为C。如何选择装入背包的物品(物品可以被分割),可以使得装入背包中物品的总价值最大? 

输入

每组输入包括三行, 
第一行包括物品个数n,以及背包容量C。 
第二、三行包括两个一维数组,分别为每一种物品的价值和重量。 

输出

背包的最大总价值(保留到小数点后两位)

样例输入 Copy
5 10
6 3 5 4 6
2 2 6 5 4
样例输出 Copy
16.67

 

def knapsack(n, W, v, w):#贪心选择函数
    p = [(v[i] / w[i], v[i], w[i]) for i in range(n)]
    p.sort(reverse=True)  # 按照单位重量的价值从大到小排序
    value = 0
    weight = W
    i = 0
    while i < n and weight > 0: #背包里还有容量的情况
        unit_value, val, wt = p[i]
        if wt < weight:
            value += val
            weight -= wt
        else:
            value += (weight / wt) * val# 计算剩余容量可以装入的部分的价值
            weight=0#清理为了下次更好的循环
        i += 1
    return round(value, 2)

while True:
    try:
        n, W = list(map(int, input().split()))
        v = list(map(int, input().split()))
        w = list(map(int, input().split()))
        result = knapsack(n, W, v, w)
        print(result)
    except EOFError:
        break

循环终止的分析:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值