来我房里有些好康的,来看看完全背包的底裤

  • 完全背包
  • 双重for循环遍历顺序再探
  • C++测试代码
  • 总结
  • 最后再啰嗦一下,稍微总结一下完全背包需要的注意事项

完全背包

有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。

完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。

在下面的讲解中,我依然举01背包的底裤里面的这个例子:

背包最大重量为4。

物品为:


每件商品都有无限个!

问背包能背的物品最大价值是多少?

01背包和完全背包唯一不同就是体现在遍历顺序上,所以本文就不去做动规五部曲了,我们直接针对遍历顺序经行分析!

首先再回顾一下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]);}
}

我们知道01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。

而完全背包的物品是可以添加多次的,所以要从小到大去遍历,即:

// 先遍历物品,再遍历背包
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]);}
}

至于为什么,我在01背包问题中也做了讲解。

这里需要注意j的起点,考虑放入当前物品的前提是当前物品的大小没有超过当前背包容量的大小,对于那些容量小于当前物品大小的状态来说,就维持旧状态即可,等于不选择当前物品

dp状态图如下:

完全背包先介绍到这,因为之前已经写过关于完全背包的文章了,文章链接放在下面:
LintCode 440 · 背包问题 III—完全背包问题
leetcode 279. 完全平方数----完全背包的套路
leetcode 322. 零钱兑换----完全背包套路解法详细再探


双重for循环遍历顺序再探

其实还有一个很重要的问题,为什么遍历物品在外层循环,遍历背包容量在内层循环?

这个问题很多题解关于这里都是轻描淡写就略过了,大家都默认 遍历物品在外层,遍历背包容量在内层,好像本应该如此一样,那么为什么呢?

难道就不能遍历背包容量在外层,遍历物品在内层?

看过这篇的话:01背包问题就知道了,01背包中二维dp数组的两个for遍历的先后循序是可以颠倒了,一位dp数组的两个for循环先后循序一定是先遍历物品,再遍历背包容量。

在完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序同样无所谓!,二维不用提更加无所谓

因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。只要保证下标j之前的dp[j]都是经过计算的就可以了。

遍历物品在外层循环,遍历背包容量在内层循环,状态如图:

遍历背包容量在外层循环,遍历物品在内层循环,状态如图:

看了这两个图,大家就会理解,完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])。

先遍历背包再遍历物品,代码如下:

// 先遍历背包,再遍历物品
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]);}
}

C++测试代码

题目链接—LintCode 440背包问题|||

1.先遍历物品再遍历背包容量的版本

class Solution {public:int backPackIII(vector<int>& A, vector<int>& V, int m){int size = A.size();//物品个数vector<int> dp(m + 1, 0);for (int i = 0; i < size; i++){for (int j =A[i]; j <= m; j++)//注意j起点值,从小到大遍历{dp[j] = max(dp[j], dp[j - A[i]] + V[i]);}}return dp[m];}
};

2.先遍历背包容量再遍历物品的版本

class Solution {public:int backPackIII(vector<int>& A, vector<int>& V, int m){int size = A.size();//物品个数vector<int> dp(m + 1, 0);for (int j = 0; j <= m; j++){for (int i = 0; i < size; i++){//因为这里把物品遍历放在内侧,因此这里需要做可否放进背包的判断if (j >= A[i]) dp[j] = max(dp[j], dp[j - A[i]] + V[i]);}}return dp[m];}
};


总结

细心的同学可能发现,全文我说的都是对于纯完全背包问题,其for循环的先后循环是可以颠倒的!

但如果题目稍稍有点变化,就会体现在遍历顺序上。

如果问装满背包有几种方式的话?那么两个for循环的先后顺序就有很大区别了,而leetcode上的题目都是这种稍有变化的类型。

这里涉及到了组合数和排列的区别 这里先不做解释,后续马上赶出这方面的文章


最后再啰嗦一下,稍微总结一下完全背包需要的注意事项

1.对完全背包的一维和二维dp而言,改变其双重for循环的顺序不会产生影响

2.一维dp下,内层循环,即物品容量对应的遍历顺序是从小到大

3.一维dp下,一般都是物品做外层循环,此时要注意内层循环j的起点是当前对应物品i的大小

今天老夫就把完全背包的底裤给你扒出来瞅瞅!!!相关推荐

  1. 孙宏斌投资乐视亏损165亿;滴滴美团高管互怼;华为手机在俄销量首超苹果丨价值早报

    第[905]期早报由[周五]赞助播出 01 今日头条 融创中国去年在乐视亏了 165 亿元 3月29日,融创中国发布财报中称,对于乐视相关公司及其关联方的款项计提人民币21亿元的坏账损失拨备.对于乐视 ...

  2. Some Self-limited Belief in my Machine Learning Goals

    读<What Is Holding You Back From Your Machine Learning Goals?>的感悟 ​ 最近在Machine Learning Mastery ...

  3. 黑客故事:如何逼小偷把 iPhone 还回来的

    看到一哥们太给力了,忍不住分享下.身边有太多朋友手机被偷了,要是get到这个技能.啧啧!!!还愁没有妹子?哈哈哈. 有个问题要问一问:假期有没有丢手机?以下是A.B.C.D四个故事,欢迎对号入座. A ...

  4. 黑客讲述 | 我如何逼小偷把 iPhone 还回来

    国庆长假过去没多久,有个问题要问一问:假期有没有丢手机?以下是A.B.C.D四个故事,欢迎对号入座. A:手机丢了,以为被扒,打手机显示关机,悲了个催的用"找回iPhone"功能, ...

  5. 黑客讲述:我如何用技术手段逼小偷把iPhone还回来

    国庆长假过去没多久,有个问题要问一问:假期有没有丢手机?以下是A.B.C.D四个故事,欢迎对号入座. A:手机丢了,以为被扒,打手机显示关机,悲了个催的用"找回iPhone"功能, ...

  6. 【谈一谈安卓手机的文件管理和垃圾清理】

    大家知道IOS的应用都是沙盒模式,每个应用独享一个沙盒,各个应用之间数据是完全隔离的,这样在卸载软件时能将应用的数据清除得很彻底. 其实安卓也有自己的沙盒,谷歌在安卓1.6之前(很多很多年前)就早已将 ...

  7. HDU 1248 寒冰王座(全然背包:入门题)

    HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...

  8. 单调队列多重背包时间复杂度O(vn)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 多重背包问题: 有N种物品和容量为V的背包,若第i种物品,容量为v[i],价值为w[i],共有n[i]件.怎样装才能使背包内的物品总价值最大? 网 ...

  9. 浅说——九讲背包之01背包

    所谓九讲,也就是: 0/1背包 0/1背包降维 完全背包 多重背包(二进制优化) 混合背包 二维费用背包 分组背包 有依赖的背包 背包的方案总数\背包的具体方案路径 0/1背包: [问题描述](经典) ...

最新文章

  1. mxnet 配置gpu
  2. python直方图均衡函数_Python中的自适应直方图均衡
  3. 如何写优雅的SQL原生语句?
  4. aix source 命令
  5. Python实训day14am【Python网络爬虫综合大作业-答辩】
  6. mysql约束与外键_MySQL 外键与约束
  7. 通过反射获得类的构造引用无视private修饰符
  8. 总结—angularjs项目
  9. 实现Kubernetes跨集群服务应用的高可用
  10. 实验教学管理系统 c语言程序代写源码下载
  11. 自定义百度网盘提取码
  12. Directional Light,Ambient,Specular,光照感性认识...
  13. mysql索引失效的几种情况分析
  14. 海南大学考研经验之(考研英语)
  15. Ubuntu18.04 + win10 双系统,grub引导配置,美化
  16. App Store 审核指南 2017-12-13
  17. Python 头哥实验题目(一、二、三)
  18. js关闭当前页面/关闭当前窗口/移动端 代码
  19. FFmpeg源代码简单分析 日志输出系统(av log 等)
  20. AMCL算法原理讲解

热门文章

  1. 【安徽大学】考研初试复试资料分享
  2. Python爬取东方财富网任意股票任意时间段的Ajax动态加载股票数据
  3. MySQL DBA必备工具使用的6大锦囊妙计
  4. 被误解最大的基础学科——统计学,到底是个啥?
  5. 太简单了!串口触摸屏开发HMI的全流程介绍成都工控开发
  6. VB6.0中关于setfocus用法
  7. 【技能】小白耳机维修入门--各种耳机插头接线图--耳机维修汇总贴
  8. 计算机义务维修活动方案,最新义务维修活动策划书
  9. 解决win10下localhost打不开的问题
  10. 毕业两年,洋洋洒洒千字文