因此,我得到了以下格式的有序对元组:
(x,y)
其中
x代表对象的物理重量,y代表对象的成本/价值。
((5, 20), (10, 70), (40, 200), (20, 80), (10, 100))
对象只能使用一次,但是在原始的有序对元组中,这些对象可能有多个。
z是可以运输的最大重量。这是一个整数。 z可以是50或类似的值。
目标:找到在给定限制Z的情况下可以发送的最大值。
困难在于我们只能使用递归,不能使用循环,也不能使用python内置函数。
我试图在整数列表中计算出最大值,我分别进行了尝试以获得某种想法。我也尝试过给对象一个“质量”并做值/重量,但这也不能很好地工作。
def maximum_val(objects: ((int,int),) , max_weight : int) -> int:
if max_weight == 0:
return 0
else:
return objects[0][1] + maximum_val(objects[1:], max_weight - gifts[0][0])
((5, 20), (10, 70), (40, 200), (20, 80), (10, 100))
示例:给定上面的元组和上限 Z = 40 ,可以获取的最佳可能值为 250->(10,70),(10, 100),(20、80)
答案 0 :(得分:1)
这被称为背包,您正在寻找递归变量。
在每一步,检查什么是最好的。包含第一个对象或跳过第一个对象:
objects =((5,20),(10,70),(40,200),(20,80),(10,100))
def recursive_knapsack(objects, limit ):
if not objects:
return 0
if objects[0][0] > limit:
#first object cant fit
return recursive_knapsack(objects[1:],limit)
include = objects[0][1] + recursive_knapsack(objects[1:], limit-objects[0][0])
exclude = recursive_knapsack(objects[1:],limit)
if include < exclude:
return exclude
else:
return include