背包问题02--其实一切都没那么难

{之前听过同学说面试华为的题目,也是背包问题。大概是这样。有一对东西的集合,他们分别有不同的重量,然后又两个包,需要你把东西分成两份,约束条件是:两个包的差别需要是最小。当时一听这题都懵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)

   

posted @ 2016-07-06 02:07  nerdlerss  阅读(215)  评论(0编辑  收藏  举报