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)