- 论坛徽章:
- 8
|
本帖最后由 20032007 于 2018-08-27 11:11 编辑
自学Python编程导论,在背包问题这里学不下去了,遇到个问题,请教帮忙。
首先定义了一个类Item,这个类实际很简单,名字n,价值v,重量w,定义了gentName、getValue、getWeight三个函数返回n、v和w。
- class Item(object):
- def __init__(self,n,v,w):
- self.name=n
- self.value=v
- self.weight=w
- def getName(self):
- return self.name
- def getValue(self):
- return self.value
- def getWeight(self):
- return self.weight
- def __str__(self):
- result='<'+self.name+','+str(self.value)+','+str(self.weight)+'>'
- return result
复制代码
然后写了一个函数,就能使用决策树来解决背包问题
- def maxVal(toConsider,avail):
- """Assumes toConsider a list of items,avail a weight.
- Returns a tuple of the total value of a solution to the
- 0/1 knapsack problem and the items of that solution"""
- if toConsider == [] or avail == 0:
- result=(0,())
- elif toConsider[0].getWeight() > avail:
- #Explore right branch only
- result =maxVal(toConsider[1:],avail)
- else:
- nextItem=toConsider[0]
- #Explore left branch
- withVal,withToTake=maxVal(toConsider[1:],avail-nextItem.getWeight())
- withVal+=nextItem.getValue()
- #Explore right branch
- withoutVal,withoutToTake=maxVal(toConsider[1:],avail)
- #Choose better branch
- if withVal>withoutVal:
- result=(withVal,withToTake+(nextItem,))
- else:
- result=(withoutVal,withoutToTake)
- return result
复制代码
我困惑不解的问题是,这个maxVal函数里,返回的是两个值,函数内部并没有明确指明第一个值是什么,第二个值是什么,但是返回的结果就是n和总的v。
- names=['a','b','c','d']
- vals=[6,7,8,9]
- weights=[3,3,2,5]
- Items=[]
- for i in range(len(vals)):
- Items.append(Item(names[i],vals[i],weights[i]))
-
- val,taken = maxVal(Items,5)
- for item in taken:
- print(item)
- print('Total value of items taken=',val)
复制代码 运行能得到正确结果,但是不明白为什么能得到结果。请教一下,应该怎么理解?
为啥maxVal函数就能向val和taken传递准确的结果?
|
|