zoukankan      html  css  js  c++  java
  • 【算法】背包——误认为贪心的陷阱

    有n件物品,第i件物品(I = 1,2,3…n)的价值是vi, 重量是wi,我们有一个能承重为m的背包,我们选择一些物品放入背包,每样只能放一个,显然放入背包的总重量不超过m。我们要求选择物品的总价值最大,请问如何选择?这里我们假设所有出现的数都是正整数。

    背包问题如果没有认真理解的话,第一种思路应该会往贪心的方面思考。

    比如先以物品贵重程度排序,先选比较贵重的。
    然而对于数据:

    n = 3, m = 3
    v = (2,2,3)
    w = (1,2,3)

    按照先选贵重物品的策略,会先选择价值为3的那个,并且背包装满了,但是如果我们选取前两个物品,总价值可以达到4。

    如果按照性价比排序:
    对于数据

    n = 3, m = 7
    v = (2,3,4)
    w = (3,4,5)

    按这种方法因为2/3 < 3/4 < 4 / 5,我们先选择第三件物品,但是选了它之后别的东西放不下了!总价值是4,但如果我们选择前两件物品可以拿到总价值5。

    造成这种现象的原因是贪心的原则为:通过每一步的最优解推导出整体的最优解,然而对于背包问题,因为每一步取或者不取的最优解取决于整体,也就是“动态”的。所以,背包问题成为了一个经典的动态规划问题。

    再看一道部分背包问题

    一个旅行者有一个最多能装m公斤的背包,然后又n重物品,它们的重量和价值分别为w[i],c[i],问旅行者能获得的最大价值

    这一题便是贪心问题,因为我们可以一直选性价比高的直到填满,所以是否贪心取决于每种物品是否只取走一部分。

    而背包问题又衍生出了很多变形,动态规划的方法也不尽相同,所以需要多加练习才能掌握这一题型。

    参考文章:
    51NOD
    百度知道
    百度文库

  • 相关阅读:
    FTP 协议和 HTTP 协议的比较
    HttpURLConnection的post请求,什么时候发出,writeData存在什么地方
    装饰器
    函数参数以及名称空间作用域
    函数的调用
    函数的返回值
    定义函数的三种方式
    函数
    day05
    day04
  • 原文地址:https://www.cnblogs.com/BoilTask/p/12569416.html
Copyright © 2011-2022 走看看