zoukankan      html  css  js  c++  java
  • 背包问题

     

    题目

    有N件物品和一个容量为W的背包。第Ni件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使价值总和最大。

     

    基本思路

    这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。

    用子问题定义状态:即f[Ni][Wi]表示前Ni件物品恰放入一个容量为Wi的背包可以获得的最大价值。则其状态转移方程便是:

    f[Ni][Wi]=max{f[Ni-1][Wi],f[Ni-1][Wi-w[i]]+v[i]}

    这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前Ni件物品放入容量为W的背包中”这个子问题,若只考虑第Ni件物品的策略(放或不放),那么就可以转化为一个只牵扯前Ni-1件物品的问题。如果不放第Ni件物品,那么问题就转化为“前Ni-1件物品放入容量为Wi的背包中”,价值为f[Ni-1][Wi];如果放第Ni件物品,那么问题就转化为“前Ni-1件物品放入剩下的容量为W-w[i]的背包中”,此时能获得的最大价值就是f[Ni-1][W-w[i]]再加上通过放入第i件物品获得的价值w[i]。

    例:背包容量W=10 物品数量N=4  对应的重量  w=[5,4,6,3]   价值 v=[10,40,30,50]  求最大价值

     两个循环:

        for Ni=0~N                                                                        

          for Wi=0~W

            f[Ni][Wi]=max{f[Ni-1][Wi],f[Ni-1][Wi-w[i]]+v[i]}     

     

    for Ni=0~N              在第Ni个外循环下,计算前Ni个物品,放在背包容量为Wi(Wi=0~W  每个外循环下 处理W个子背包问题)下的最大值

    for Wi=0~W            对容量为Wi(0~W)的每个背包,第Ni个物品可放可不放,所获得的最大价值为 放或者不放两种情况下的最大值

    f[Ni][Wi]=max{f[Ni-1][Wi],f[Ni-1][Wi-w[i]]+v[i]} 

           

     f[N][W] 为问题的解,前N个物品 放在容量为W的背包中 能取得的最大价值

     

    参考自:http://love-oriented.com/pack/P01.html

  • 相关阅读:
    time 模块学习
    day 14 自定义模块,常用模块 time .datetime ,time 模块
    day 13 课后作业
    day 12 课后作业
    day 11课后作业
    树状数组最值
    hdu 1059 Dividing bitset 多重背包
    XVII Open Cup named after E.V. Pankratiev. XXI Ural Championship
    最长公共子序列板/滚动 N^2
    Uva 10635
  • 原文地址:https://www.cnblogs.com/chengdabelief/p/6662238.html
Copyright © 2011-2022 走看看