问题描述:
对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最大重量限制的条件上下,背包中物品总重量的最大值是多少呢?
比如对于一组物品,重量如下
(2,2,4,6,3)
画出递归树
虚线框表示预判断,放了之后超了,表示不执行了
有颜色的框表示之前的分支已经执行过了,有重复,不再执行。
相当于剪枝,大大降低了时间复杂度
相应的代码实现
max_w = -1 # 总重量
weight = [2,2,4,6,3] # 物品重量
n = 5 # 物品个数
capacity = 9 # 背包承受的最大重量
mem = {} # 备忘录
def bag01(idx, cur_w):
global max_w
if cur_w == capacity or idx == n:
if cur_w>max_w:
max_w = cur_w
return
bag01(idx + 1 ,cur_w)
if (cur_w + weight[idx]) <= capacity:
bag01(idx + 1 ,cur_w + weight[idx])
bag01(0, 0)
print(max_w)
PS:虽然递归树看上去是并行执行的,但递归的过程是压栈执行的,是顺序一条分支一条分支执行的,所以可以
只用一个变量max_w保存当前的总重量,只要判断下此条分支的总重要是否比之前分支的放法更好即可