当前位置: 首页 > news >正文

完全背包—动态规划

一、背包问题概述

请添加图片描述
如图,完全背包与01背包的区别只有一点:01背包中每个物品只能取一个而完全背包中每个物品可以取无数个。解决完全背包问题必须首先弄明白01背包,不清楚的可以看我的这篇文章01背包—动态规划。

二、例题

重量价值
物品0115
物品1320
物品2430

背包最大容量为4。

每一个物品有两个状态,“取”或者“不取”。利用回溯法可以暴力枚举所有物品的状态的排列组合状态,与背包最大容量比较就可以求得最大的价值,时间复杂是O(2n)O(2^n)O(2n)为指数级别,故需要动态规划的解法来进行优化。

三、一维数组(滚动数组)解完全背包

1. 从01背包到完全背包

由01背包—动态规划,我们可以得知一维DP数组是二维DP数组的简化。所以,二维DP数组与一维DP数组在本质上一样的,本文只介绍一维DP数组解完全背包。

对于01背包来说,内循环j是从大到小倒叙遍历的,这样做的原因是防止dp[j]前的元素被污染,避免累加的问题(每个物品只能选一次)。而对于完全背包来说,每个物品可以选择无数次,j从前向后遍历就是对每个容量j都尝试放入物品i看会不会使总价值变大,其本身并不关注放入物品i的个数。所以,完全背包与01背包的代码只有一个区别,就是j的遍历顺序。

// 01背包遍历
for(int i = 0; i < weight.size(); i++) { // 遍历物品for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}
}
// 完全背包遍历
// 先遍历物品,再遍历背包
for(int i = 0; i < weight.size(); i++) { // 遍历物品for(int j = weight[i]; j <= bagWeight ; j++) { // 遍历背包容量dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}
}

2. 01背包与完全背包的不同—遍历顺序

01背包的遍历顺序为:

二维DP数组中,先遍历物品或先遍历背包容量都可以;

一维DP数组中,必须先遍历物品在遍历背包容量。只有这样才能确保每个物品只选一次。

对于完全背包,没有了只能选一次的限制,那么先遍历背包容量再遍历物品可不可以呢?答案是可以的。因为dp[j] 是根据下标j之前所对应的DP数组元素计算出来的。 只要保证下标j之前的DP数组都是经过计算的就可以了。图一是先遍历背包容量再遍历物品;图二是先遍历物品,再遍历背包容量。


请添加图片描述

// 先遍历物品,再遍历背包
for(int i = 0; i < weight.size(); i++) { // 遍历物品for(int j = weight[i]; j <= bagWeight ; j++) { // 遍历背包容量dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}
}// 先遍历背包,再遍历物品
for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量for(int i = 0; i < weight.size(); i++) { // 遍历物品if (j - weight[i] >= 0) dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}
}
http://www.lryc.cn/news/17755.html

相关文章:

  • 消息队列MQ介绍
  • C语言进阶(八)—— 链表
  • 手工测试用例就是自动化测试脚本——使用ruby 1.9新特性进行自动化脚本的编写
  • RockerMQ简介和单节点部署
  • SFP光纤笼子 别称 作用 性能要点 工程要素
  • [HarekazeCTF2019]Easy Notes
  • Java学习-IO流-字符流-FileReader
  • python攻陷米哈游《元神》数据?详情请看文章。。
  • 【unity细节】基于unity子对象(如相机)为什么无法进行z轴的拖拽移动和z轴自动归位的问题
  • 如何维护固态继电器?
  • Sprng依赖注入(三):构造方法注入是如何工作的?
  • 「1」指针进阶——详解
  • JS语法让人困惑的点 “==与===”
  • 《狂飙》壁纸大嫂如此惊艳,做成日历壁纸天天看
  • 手机照片删除了怎么恢复
  • maven pom.xml 依赖的scope属性
  • git 的使用方法 (下 - 远程仓库和图形化)
  • Java基础:拼图小游戏
  • 一个跟蘑菇结缘的企业老板
  • 【Leetcode 剑指Offer】第 4 天 查找算法(简单)
  • Jenkins利用docker部署vue项目
  • 【Linux】如何将ntfs硬盘挂载到home目录下并具有读写权限
  • 拖拽删除元素、拖拽排序、拖拽预览图片和拖拽移动元素
  • yarn的global安装命令不生效
  • 如何发布自己的npm包?
  • 达梦数据库 闪回查询
  • java基础学习 day44(多态的优点和劣势)
  • Guna UI WinForms 2.0.4.4 Crack
  • 零售航母沃尔玛公布业绩:喜忧参半
  • Python学习笔记丨while、for、if循环结构基础知识与易错点