动态规划01背包记录
2015-06-29 23:51
134 查看
01背包是动态规划的一种类型其主要的形式是:
1、所有类型物品每种类型只有一个
2、一次只能取一个且物品不能分割
3、只有取或者不取(所以叫01背包,就是只有这两种情况)
4、在背包容量不满的前提下尽可能多的装入最大价值的物品
设背包的容量为V,第i个物品的重量为weigh[i]对应的价值为price[i]; 设容量为j(j的最大值为背包的容量)的背包所能装的最大价值为dp[j]
n为所有的物品个数,我们先从第1个数据开始,则此物品重量为weigh[1],则我们将所有大于weigh[1]的背包都放入第1个物品(即从dp[V]到
dp[weigh[1]])此时所有的大于weigh[1]重量的背包都装入第一个物品。
接下来我们装入第2个物品,此时同样我们要对所有的容量大于weigh[2]的背包都装入第二个物品,但是由于装第一个物品时一些背包已经装入
了第一件物品,怎么办呢?分以下几种情况
1、如果在装入第一件物品后容量不足以装入第二件物品且第一件物品的价值大于第二件则不装入第二件
2、如果在装入第一件物品后剩余容量不足以装入第二件物品且第一件物品的价值不如第二件的大则将第二件物品装入取出第一件(当然在程序
中可以直接覆盖当做取出第一件物品)
3、如果装入第一件物品后容量任然足以装下第二件物品,则将两件物品一同装入背包中
代码实现:
以此类推
大神勿喷
1、所有类型物品每种类型只有一个
2、一次只能取一个且物品不能分割
3、只有取或者不取(所以叫01背包,就是只有这两种情况)
4、在背包容量不满的前提下尽可能多的装入最大价值的物品
设背包的容量为V,第i个物品的重量为weigh[i]对应的价值为price[i]; 设容量为j(j的最大值为背包的容量)的背包所能装的最大价值为dp[j]
n为所有的物品个数,我们先从第1个数据开始,则此物品重量为weigh[1],则我们将所有大于weigh[1]的背包都放入第1个物品(即从dp[V]到
dp[weigh[1]])此时所有的大于weigh[1]重量的背包都装入第一个物品。
接下来我们装入第2个物品,此时同样我们要对所有的容量大于weigh[2]的背包都装入第二个物品,但是由于装第一个物品时一些背包已经装入
了第一件物品,怎么办呢?分以下几种情况
1、如果在装入第一件物品后容量不足以装入第二件物品且第一件物品的价值大于第二件则不装入第二件
2、如果在装入第一件物品后剩余容量不足以装入第二件物品且第一件物品的价值不如第二件的大则将第二件物品装入取出第一件(当然在程序
中可以直接覆盖当做取出第一件物品)
3、如果装入第一件物品后容量任然足以装下第二件物品,则将两件物品一同装入背包中
代码实现:
for(i=0;i<n;i++) { for(j=V;j>=weigh[i];j--)//将所有重量大于weigh[i]的背包装入物品 { dp[j]=max(dp[j],dp[j-weigh[i]]+price[i]); } }
以此类推
大神勿喷
相关文章推荐
- Java中HashMap和TreeMap的区别深入理解
- DNS
- Bitwise AND of Numbers Range——LeetCode
- lishell学习之路:流程控制(case)
- 转--2014年最新810多套android源码2.46GB免费一次性打包下载
- 开博第一篇:没曾想,多年之后,终究还是回来了
- [Tyvj 1052] 没有上司的舞会
- C语言Web service编程
- 阿里巴巴产品实习生零天
- PHP之开发环境
- FMDB使用(转载)
- [转载] Java集合框架之小结
- 转-android 支付宝SDK集成
- HTML5制作web app
- java设计模式之工厂模式(工厂方法、抽象工厂)
- 置换+DP POJ 3590
- Python项目一:即时标记
- 转-封装网络请求库,统一处理通用异常 (基于volley网络请求库)
- HDU 1272 小希的迷宫 (水题)
- MySQL的常用语句