动态规划 01背包问题

01背包问题是动态规划中一个非常经典的例子,是让我们在一个背包所能限制的放下的最大重量范围内,选取出能放入物品的最大的价值。这就需要我们进行挑选,对每个物品进行放入或者不放入的选择,还有在规定的范围内能放入多少物品,能取得多少价值这都是需要我们考虑的问题。

如上图所示,就是给了五个不同重量且价值不同的物品,需要进行挑选,将限制最大重量15kg的背包内能放入的物品价值最大化,这就需要我们进行思考和规划。

首先我们要根据题意,思考如何才能建立出一个状态表格,在上述情况中,我所建立出的是下面这张表格,将物品的重量作为横坐标,物品的编号作为纵坐标,那么剩下的空余处就是每次针对不同情况(不同重量的不同物品)能获取的最大价值,这样进行动态规划,那么最后一个格子所得到的必定是可以获取的最大价值。

然后是根据这张表格来编写代码的实现。

就根据上面那张表格的思想来写,给定两个数组分别代表物品的重量和物品的价值,并且还有一个背包的最大限制重量,然后创建一个二维数组dp来代表状态,每次根据不同的条件能得出当前条件下的最大价值,写一个双重循环,进行遍历各种不同的情况。

最关键的核心在于算法。思想是:当前这一层的dp和上一层的dp进行比较得出最大的那个值覆盖到当前dp。但是当前这一层dp需要先获取当前所属下标index的物品的价值,再加上当前下标的上一层也就是index-1但是重量需要减去当前物品的重量,这样就能获取到上一层去除当前物品的重量所能得到的最大价值,直接将获取的这个dp值加上当前index的价值,就能获取当前最大的价值,然后和上一层最大价值相比,哪个更大就把它覆盖到当前的dp位置上,这样进行双重循环完毕之后,最后的那个dp就必定会是最大的价值。

至于下面的那个循环是输出二位数组dp,能更加清楚的看到dp的变化,也能看到每一层的当时的最大的价值。

当然也不能忘记了最前面的对dp进行初始化,当重量为0的时候肯定是不能放入物品的所以最大价值当然也为0。

将物品的价值和重量传入数组就可以进行调用上面的动态规划,然后就能得出最大的价值了

这里我们可以很清楚的看到,最后得到的最大的价值就是15。也可以清楚的看到dp是如何变化的,最后如何得到了最大的价值15。

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值