01背包问题 详细推导
2013-04-22 22:31
267 查看
01背包(每种物品有且只有一件)
问题重现:
在n件物品取出x件放在空间为m的背包里,每件物品的体积为w1,w2……wn,与之相对应的价值为p1,p2...pn
从其中选出若干物品装入背包可使这些体积总和不超过背包容量,求出获得最大价值的方案。
子问题状态定义:c[i][m]表示在前i(包括i)件做出选择后放入容量为m的背包的最大价值
状态转移方程为:c[i][m]=max{c[i-1][m],c[i-1][m-w[i]]+p[i]}
备注:背包容量m,物品编号i,对应物品价值p[i],对应物件体积w[i]
证明:
第i件物品放或者不放,分为两种情况,最终取二者中价值最大者
①放入:说明总价值需要重新计算。也就是转换为前i-1件物品放入容量为m-w[i]的情形,当然还需要加上第i件物品的价值。即:c[i-1][m-w[i]]+p[i];
②不放:这样的话就只取决于前i-1件物品放入容量为m的情形。即:c[i-1][m]
优化:
①去除所有容量大于m的物品
②去掉所有一眼看过去就知道性价比不如另一个物品的物品,如w[i]>=w[j] && p[i]<=p[j]
问题重现:
在n件物品取出x件放在空间为m的背包里,每件物品的体积为w1,w2……wn,与之相对应的价值为p1,p2...pn
从其中选出若干物品装入背包可使这些体积总和不超过背包容量,求出获得最大价值的方案。
子问题状态定义:c[i][m]表示在前i(包括i)件做出选择后放入容量为m的背包的最大价值
状态转移方程为:c[i][m]=max{c[i-1][m],c[i-1][m-w[i]]+p[i]}
备注:背包容量m,物品编号i,对应物品价值p[i],对应物件体积w[i]
证明:
第i件物品放或者不放,分为两种情况,最终取二者中价值最大者
①放入:说明总价值需要重新计算。也就是转换为前i-1件物品放入容量为m-w[i]的情形,当然还需要加上第i件物品的价值。即:c[i-1][m-w[i]]+p[i];
②不放:这样的话就只取决于前i-1件物品放入容量为m的情形。即:c[i-1][m]
优化:
①去除所有容量大于m的物品
②去掉所有一眼看过去就知道性价比不如另一个物品的物品,如w[i]>=w[j] && p[i]<=p[j]
相关文章推荐
- HDU_3466_Proud Merchants详细解答(01背包(排序问题))
- 动态规划的详细解析(01背包问题)
- 八皇后问题详细推导(递归和非递归,Go语言实现)
- 完全背包问题 详细推导
- 多重背包问题 详细推导
- 动态规划的详细解析(01背包问题)
- 动态规划的详细解析(01背包问题)
- 比较详细的讲01背包问题(值得看)
- vector::erase()方法的详细介绍及问题解答的问题
- WIN7下安装Oracle 10g 的详细过程以及有关问题的解决(转)
- 最大报销额(01背包问题)
- poj1837 动态规划和01背包问题延伸的经典题目,很值得一做
- MySQL Sending data导致查询很慢的问题详细分析
- 蚊子132 详细解说 LINUX 下的FTP配置及常见问题
- spring boot 用war包部署到tomcat下详细教程(解决缺少web.xml报错的问题)
- 背包九讲-01背包问题
- 01背包问题和完全背包问题
- ubuntu下Android开发环境的搭建:eclipse+SDK详细安装教程+常见问题及其解决方案
- 支持向量机(SVM)的详细推导过程及注解
- PHP session_start()问题解疑(详细介绍)