在Python中实现分数背包问题的程序
假设我们有两个列表,权重和相同长度的值,以及另一个值容量。权重[i]和值[i]表示第i个元素的权重和值。因此,如果我们最多可以采用容量权重,并且可以按比例取值,则占项目权重的一小部分,则必须找到可以得到的最大值(四舍五入为最接近的整数)
因此,如果输入像权重=[6,7,3]值=[110,120,2]容量=10,那么输出将是178。
为了解决这个问题,我们将遵循以下步骤-
res:=0
cif容量为0,则
如果pair[0]>容量,则
否则,当pair[0]<=容量时,则
从循环中出来
res:=res+(pair[1]/(pair[0]/容量)的商
容量:=0
res:=res+对[1]
容量:=容量-对[0]
列出具有权重和值的对P的列表,并根据每个权重的值对它们进行排序
对于P中的每对
返回res的底值
让我们看下面的实现以更好地理解-
示例
class Solution:
def solve(self, weights, values, capacity):
res = 0
for pair in sorted(zip(weights, values), key=lambda x: - x[1]/x[0]):
if not bool(capacity):
break
if pair[0] > capacity:
res += int(pair[1] / (pair[0] / capacity))
capacity = 0
elif pair[0] <= capacity:
res += pair[1]
capacity -= pair[0]
return int(res)
ob = Solution()weights = [6, 7, 3]
values = [110, 120, 2]
capacity = 10
print(ob.solve(weights, values, capacity))输入值
[6, 7, 3],[110, 120, 2],10
输出结果
230