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

  • 相关阅读:
    FZU 2098 刻苦的小芳(卡特兰数,动态规划)
    卡特兰数总结
    FZU 1064 教授的测试(卡特兰数,递归)
    HDU 4745 Two Rabbits(区间DP,最长非连续回文子串)
    Java 第十一届 蓝桥杯 省模拟赛 正整数的摆动序列
    Java 第十一届 蓝桥杯 省模拟赛 反倍数
    Java 第十一届 蓝桥杯 省模拟赛 反倍数
    Java 第十一届 蓝桥杯 省模拟赛 反倍数
    Java 第十一届 蓝桥杯 省模拟赛 凯撒密码加密
    Java 第十一届 蓝桥杯 省模拟赛 凯撒密码加密
  • 原文地址:https://www.cnblogs.com/Pinging/p/7899610.html
Copyright © 2011-2022 走看看