zoukankan      html  css  js  c++  java
  • 算法复习周------“动态规划之‘0 1背包问题’”

    问题描述: 给定n个物品和一个背包,物品i的重量为Wi,价值为Vi,背包的容量为c。求如何选择装入背包的物品使得装入的物品总价值最大。

    要解决这个问题,我们要从上到下来解决。我用例题来说明吧。。。(算法这个东西写出来是真的难。。。。)

    算法详解:


    这里我们直接给出递推方程:

    这里的m矩阵中有两个变量M[i][j],其中i表示当前处理的物品为i,j表示当前背包中能存入的最大的容量。

    ①j<wi时,意思是当当前背包可装入的容量<第i个物品的重量时,我这个物品肯定装不进去呀对不对。所以所以第i个物品不装进去,此时m[i][j]中存入的最优解为上一个m[i+1][j]。

    ②i>wi时,我们要分两种情况,第一是放入当前的这个第i个物品(要加上第i个物品的价值),第二种情况是不放入第i个物品。比较大小取最大值。

    例题:

    这里一共有5个物品,背包的总重量为10,每个物品的重量分别为{2 2 6 5 4} 每个物品的价值为{6 3 5 4 6}。

    这里我们要用一个二维矩阵来处理问题:

    我们在填写这个表格的时候是先从第五行开始依次向上。因为第五个数的重量是4,所以[5,0]到[5,3]均为0(因为放不下。。。)后面[5,4]到[5,10]全是6。

    之后填写第四行,第四个物品的重量为5,所以5之前背包中是不够放第四个物品的,所以原样把下面的值誊写过去。从[4,5]开始,我们可以分两种情况  ①对于[4,5]这个空格,我们可以分为 [5,0]+4=4与[5,5] =6  所以选择6写到这个格子里。

    在最后一行中,我们不用考虑前面的数,只用考虑最后一个[1,10]就好。因为我们要求得最大容量的背包最大值,而要求这个解只用到下一行的数据,不需要用同一行的数据。

    得到[1,10]=max([2,10],[2,8]+6) 得到[2,8]+6=15>11 将第1个数装入背包。

    由此我们根据箭头可以得到。[1,10]是由[2,8]得到,所以第一个物品装入。

    [2,8]是由[3,6]得来,所以 第二个物品装入。

    [3,6]是由[4,6]得来的,说明第三个物品没有装入。同理第四个物品没装入。

    而第五个物品装入后得到的6,所以第五个物品装入了。

    最后得到最后的解为(1,1,0,0,1)。

    动态规划01背包的问题就在于这个矩阵的填写,所以我们要理解出来这个过程。代码这里就不详细写了,大家可以查一查。有什么要交流的地方大家给我留言哈~

    再次感谢老师的课件。。。。

    ————————————————————————————————————————Made By  Pinging

  • 相关阅读:
    集合选数
    二分答案入门乱讲
    浅谈搜索剪枝
    数位DP
    RMQ问题与ST算法
    计数排序与基数排序
    主席树/函数式线段树/可持久化线段树
    树链剖分
    LCA问题
    树的直径、树的重心与树的点分治
  • 原文地址:https://www.cnblogs.com/Pinging/p/7899610.html
Copyright © 2011-2022 走看看