def maxval(w,v,i,aw):
'''决策树求0/1背包最优解
见注释部分
w:weight v:value i:物品个数
aw:allowable weight背包承受重量'''
#print 'call maxval:
',i, aw
global numcall
numcall += 1
#本函数被调用的次数
##迭代的终点:只有一个物品
if i == 0:
if w[i] <= aw: #能放得进……
return
v[i] #就是这一个物品的价值
else :
#放不下……
return 0
#一个也带不走。
#下面开始迭代过程
面对i的物品,如果不选择……
without_i =
maxval(w,v,i-1,aw) #不选择i分支进行迭代,得到的最大价值。
if w[i] > aw:
#如果选择i,判断能否放得下
return without_i
#放不下,这分支作废,按左分支计算
else :
#如果能放下……
with_i = v[i] + maxval(w,v,i-1,aw-w[i])
#调整容量,本分支迭代。
return
max(without_i,with_i) #左右分支取较大者
if __name__=='__main__':
weights = [2, 2, 6, 5,
4]
vals = [6, 3, 5, 4,
6]
numcall = 0
res = maxval(weights,
vals, len(vals)-1, 8)
print('Max Val =',res,
'numbers of calls ', numcall)
weights = [1, 1, 5, 5,
3, 3, 4, 4,1,1, 5, 5, 3, 3, 4, 4]
vals = [15, 15, 10, 10,
9, 9, 5, 5,1, 1, 5, 5, 3, 3, 4, 4]
numcall = 0
res = maxval(weights,
vals, len(vals)-1, 15)
print('Max Val =',res,
'numbers of calls ', numcall)