【算法】——动态规划之0-1背包问题

    借着软考的机会,好好的研究了一下关于算法部分的内容,其中动态规划也是非常实用的算法,之前觉得看算法是非常难理解,后来用了一张图竟然神奇的看懂了,下面小编画给大家看!


动态规划法基本思想


    将待求解的问题分解成若干个子问题,先求解子问题,然后从浙西子问题的解得得到原问题的解。但是动态规划的到子问题的解不是孤立的,保存在已解决的子问题的答案,在需要时找出以求的答案,避免大量的重复计算。为了达到目的用一张二维表来记录所有已解决的子问题的答案。


解决步骤


      1)、找出最优解的性质,并刻画其结构特征

      2)、递归地定义最优解的值

      3)、以自底向上方法计算出最优值

      4)、根据计算最优值时得到的信息,构造一个最优解


为什么自底向上计算?


    动态规划法思想提出,用一张表记录已解决问题的答案,当有需要的时候可以借助之前解决过的子问题进行求解。而动态规划经常会用到递归的方式求解。


什么样的问题使用动态规划法?


    1)、最优子结构

    2)、重叠子结构

0-1背包问题递归定义求最优解

i表示放入的第i物品,w表示背包可容纳的质量

C[i,w]表示包中放有i件物品,可容纳质量为w时的价值

       


1、先解释为什么C[i,w]会等于0?


    当背包中没有物品可以放入的时候,此时i为0,背包的价值为0,当背包中可容纳的物品质量为0时,此时w=0,背包的价值同样为0


2、什么时候C[i,w]= C[i-1,w]?


    当要放入第i件物品的时候,可是i物品的质量wi大于当前背包所能装下的总质量w,所以i不能放入,此时当想把第i件放入背包的价值等于放入i-1的价值


3、当上述两种情况都不存在时候,0-1背包就是在比较第i件物品放入还不放入的时候价值最大?


当i放入的时候


     此时背包相当于在放入i-1件物品,重量为w-wi的背包中放入了一件价值为V物品,则C[i,w]=C[i-1,w-wi]+Vi;


当i不放入的时候


    此时背包相当于放入i-1件物品,在重量为w的背包中,则此时价值C[i-1,w]。


题目描述

    有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?

首先用一张表来表示这个动态规划的过程,切记这种表是自底向上,而且是从左到右生成的。


举个例子

E行4列,用坐标表示c(1,4),具体的含义是只有E物品时,有个承重为4的背包,此时背包的价值为6。

那么c(5,9)此时背包价值为15,又是怎样计算的呢?


   根据前面的知识讲解,在求得15之前判断A物品到底该不该放入?


当A不放入的时候

    其实是把E,D,C,B放入承重为9的背包中,求最优结构,也就是C[i-1,w]=C[4,9],查表得此时背包价值为10


当A放入的时候

   其实是把E、D、C、B放入承重为7的背包中,然后加上A物品的价值,就是C[i-1,w-w­i]+VA=C[4,7]+VA=15

根据公式得Max c[i-1,w-wi]+vi, c[i-1,w]  此时最大值为15


总结

    小编感觉动态规划法的学习主要是搞懂算法的含义,知道求得最优解的三个方法非常重要,它能帮助我们更好的了解算法的思想。动态规划法就是先把问题拆解,然后从基础做起,学会站在巨人的肩膀上,就是尝试使用之前的劳动成果,从而到达效率提高的目的。

    如有理解偏颇之处,还请各位大神斧正,不胜感激!


    

转载于:https://my.oschina.net/u/3705835/blog/1550154

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值