{之前听过同学说面试华为的题目,也是背包问题。大概是这样。有一对东西的集合,他们分别有不同的重量,然后又两个包,需要你把东西分成两份,约束条件是:两个包的差别需要是最小。当时一听这题都懵b了。但是这个问题难得倒我吗?于是我赶紧喝瓶82的芬达压压惊。}
总之我们接着之前0/1背包问题:
有一个包和n个物品,包的容量为m,每个物品都有各自的体积和价值,问当从这n个物品中选择多个物品放在包里而物品体积总数不超过包的容量m时,能够得到的最大价值是多少?[对于每个物品不可以取多次,最多只能取一次,之所以叫做01背包,0表示不取,1表示取]
我们假设这里有三个物品 它们的重量分别是 5 2 3 而它们的价值是 9 7 8 你的包只能装下5
这里我们用决策树来看流程{这里我们三个数字表达一个节点
这三个数字分别表示的是index,包的剩余承重,已经节点时间内,包里面物体的重量
我们这边采用的是 left first 算法来表示关联关系,用回溯法来完成具体的操作。 所以
我们可以把左边的箭头当成,不需要index的值。
右边则相反
}
我们可以看到这是一个典型的二叉树.
def maxVal(w, v, i, aW):
if i == 0:
if w[i] <= aW: return v[i]
else: return 0
without_i = maxVal(w, v, i-1, aW)
if w[i] > aW:
return without_i
else:
with_i = v[i] + maxVal(w, v, i-1, aW - w[i])
return max(with_i, without_i)