背包递归功能

时间:2016-11-20 03:05:09

标签: python recursion

我有一个名为self.items的列表,其中的元素是:

items = [dict(id=0, w=4, v=12),
         dict(id=1, w=6, v=10),
         dict(id=2, w=5, v=8),
         dict(id=3, w=7, v=11),
         dict(id=4, w=3, v=14),
         dict(id=5, w=1, v=7),
         dict(id=6, w=6, v=9)]

有了这个我必须做一个列表列表,其中每个元素都有所有可能的组合,包括空案例,所以最后我的列表列表或多或少有这个外观:

[[],[{id:0,w:4,v:12}],....,[{id:0,w:4,v:12}, {id:1,w:6,v:10}]....]

现在我必须找到一个递归函数来搜索具有允许的最大权重和最大值的元素组合。

 def recursive(self, n, max_weight):
""" Recursive Knapsack
:param n: Number of elements
:param max_weight: Maximum weight allowed
:return: max_value
"""
self.iterations += 1 
result = 0

if max_weight > self.max_weight: #they gave me self.max_weight as a variable of  __init__ method which shows me what is the maximum weight permitted
    self.recursive(self, self.items+self.iterations, max_weight)
    if max_weight < self.max_weight:
        self.recursive(self, self.items+self.iterations, max_weight)
    else:
            result = self.items['v']+result

return result

我认为我的错误就在这一行:

result = self.items['v']+result

但是我找不到它。

1 个答案:

答案 0 :(得分:0)

我刚刚找到了这个递归问题的解决方案: (我来自西班牙所以变量“cantidad”也意味着“数量”)

 def recursive(self, n, max_weight):
    """ Recursive Knapsack
    :param n: Number of elements
    :param max_weight: Maximum weight allowed
    :return: max_valu
    """
    self.iterations += 1
    result = 0
    cantidad = 0
    quantity = 0

    if max_weight == 0 or n == 1:
        if  max_weight >= self.items[n-1]['w'] :
            cantidad= self.items[n-1]['v']

        return max(cantidad,quantity)
    else:
        if  max_weight >= self.items[n-1]['w']:
            cantidad = self.items[n-1]['v']+self.recursive(n-1,max_weight-self.items[n-1]['w'])

        quantity = self.recursive(n-1,max_weight)
        result = max(cantidad, quantity)
        return result

我将此代码放入我正在学习的大学比例的程序中,并且它返回给我正确的结果:

Method: recursive
Iterations:107
Max value:44 expected max_value:44