递归尝试查找最大的无循环次数

时间:2019-05-06 07:28:57

标签: python recursion python-3.7

因此,我得到了以下格式的有序对元组:

(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)

1 个答案:

答案 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