动态规划之背包问题 python实现

动态规划之01背包问题

题目描述:有编号分别为1,2,3,4,5的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?
动态规划的核心过程有两部分,一个是找出问题的”子状态”,再一个就是建立“状态转移方程”(所谓的递推公式)。将上面的问题解决,动态规划就解了一般,剩下的为代码将数学的公式的进行实现。
- 动态规划的思路。先将原始问题一般化,欲求背包能够获得的总价值,即欲求前i个物体放入容量为m(kg)背包的最大价值c[i][m]——使用一个数组来存储最大价值,当m取10,i取3时,即原始问题了。而前i个物体放入容量为m(kg)的背包,又可以转化成前(i-1)个物体放入背包的问题。下面使用数学表达式描述它们两者之间的具体关系。
- w[i]:第i个物体的重量
- p[i]:第i个物体的价值
- c[i][j]:前i个物体放入容量为j 包的最大价值
- c[i-1][j]:前i个物体放入容量为j 包的最大价值
- c[i-1][j-w[i]]:前i-1个物体放入容量为j-w[i] 包的最大价值

以下通过表格来说状态转移方程
c[i][m]=max{c[i-1][m-w[i]]+p[i](m>w[i]) , c[i-1][m]}
这里写图片描述
首先明确该表是至底向上,从左到生成的。且上边abcde带代表编号5,4,3,2,1

  • c[3][2]代表 编号1,2,3三件物品放入容量为2的包中的最大价值。因为编号1,2,3的任一件物品的重量都要大于2,装入容量为2的包。即w[i]>2(i=1,2,3) 故c[3][2]=0
  • 现在通过思考c[5][8]=15的由来理解上式的状态转移方程
    • 根据c[i][m]=max{c[i-1][m-w[i]]+pi(m>w[i]) , c[i-1][m]}公式,需要考虑c[4][8-w[5]]+p[5]=9+6=15, c[4][8]=9, c[5][8]=15
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值