zoukankan      html  css  js  c++  java
  • 背包问题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)
    

       

  • 相关阅读:
    css3
    如何去渲染数据?
    ajax
    Java多线程-线程安全
    java多线程-基础
    Git-团队开放中的代码同步与提交
    IDEA 调试Spring-boot 应用
    微服务-各种pom的配置和注解
    微服务-服务与注册中心
    微服务
  • 原文地址:https://www.cnblogs.com/nerdlerss/p/5645566.html
Copyright © 2011-2022 走看看