Python算法题解:动态规划解0-1背包问题
概述
背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。
定义
我们有 n 种物品,物品 j 的重量为wj,价格为pj。
我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。
如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题。
如果限定物品j最多只能选择bj个,则问题称为有界背包问题。
如果不限定每种物品的数量,则问题称为无界背包问题。
动态规划
动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。
通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。
思路
举例,令物品数量N=5,背包所能承受的最大重量为W=10,物品与价格的对应关系如下表左三列所示。
当放入物品a时,在背包所能承受的重量内,计算背包拥有的物品总价格,并进行标记,如表格第一行所示,当背包所能承受的重量大于等于2时,都可以放入物品a,背包拥有的物品总价格为6。
接着我们放入物品b,放入之前,一是要判断背包是否所能承受其重量,二是判断放入之后与放入之前拥有的物品总价格哪个最大,如表格第二行所示,当背包所能承受的重量大于等于2时,都可以放入物品b,但是,物品b在背包容量为[2,3]的时候,放入之后的总价格3不如放入之前的总价格6大,所以不放入。
当背包所能承受的重量等于4时,放入物品b后,背包所能承受的重量4减去物品b的重量2后,剩余的所能承受的重量2还可以放入物品a,此时背包拥有的物品总价格为物品a和物品b的总价格之和,即为9,大于放入之前的物品总价格6,所以此时背包拥有的物品总价格最大为9。
分析可知,在一层循环遍历下,我们需要一个一维数组保存背包所能承受的最大重量与其拥有的物品总价格,并不断更新。
代码
Copy/0-1背包问题@paramN物品数量@paramW背包容量@paramweight物品重量@paramvalue物品价格@return最大价值/privatestaticinttraceBack(intN,intW,int[]weight,int[]value){int[]dp=newint[W+1];//范围[0,W]当前背包容量对应的物品总价值for(inti=0;i=weight[i];j--){//只要背包可以放入就放dp[j]=Math.max(dp[j-weight[i]]+value[i],dp[j]);//比较放入物品之前与放入之后的价值哪个大}}returndp[W];}
复杂度
显而易见,算法需要的时间复杂度为O(nW),空间的消耗(即所需的一维数组)为O(W)。
有不清楚的地方,伙伴们可以留言,更多的Python相关教程也会继续为大家更新!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一文带你彻底搞懂智能仓储!
云栖号:https://www.aliyun.com/#module-yedOfott8第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 在不断倡导“智能制造”的今天,智能仓储似乎作为一个全新的概念,日渐进入人们的生活工作,特别是最近,很多人开始大谈“智能+”的话题,但是,谈了那么久,你知道什么才是真正的智能仓储吗?企业又到底应该如何实现智能仓储呢? 什么是智能仓储? 智能仓储是仓库自动化的产物。 与智能家居类似,智能仓储可通过多种自动化和互联技术实现。这些技术协同工作以提高仓库的生产率和效率,最大限度地减少人工数量,同时减少错误。 在手动仓库中,我们通常会看到工人随身携带清单,挑选产品,将产品装入购物车,然后将它们运送到装运码头;但在智能仓库中,订单会自动收到,之后系统确认产品是否有库存。然后将提货清单发送到机器人推车,将订购的产品放入容器中,然后将它们交给工人进行下一步。 而智能仓储则完全解决了对人工的依赖问题,在智能仓储系统(如C-WMS)的帮助下,自动接收,识别,分类,组织和提取货物。最好的智能仓储解决方案几乎可以自动完成从供...
- 下一篇
懂技术!混圈子!双十二拼团大咖灰太狼教你如何流量变现!
大家好,我叫灰太狼,在一家互联网公司担任程序员一职,但是正不正经我就不大清楚了。比起最近在群内接触到的称霸拼团赛榜首的大佬们,我只是一枚刚入门云大使两三个月的萌新,但在这次双十一和双十二拼团赛中,我结合自身的优势,也找到了最适合自己的推广方式,成为云大使这段时间也有不少的感悟,现在就来与大家分享一下。 我也像很多其他程序员小伙伴一样,平时没有什么特别花时间的爱好,对于闲暇时间针对专业知识和工作的思考,我喜欢用写文章的方式记录下来,在个人公众号中与志同道合的小伙伴们分享交流技术,当然也有一些时事热点(欢迎大家去公众号关注我,与我多多交流,公众号ID:Python乱炖)。在我看来,写技术文章不仅可以不断为自己沉淀经验与知识,还可以帮助到不少渴望知识渴望成长的人,这是一件十分有意义的事情。 在了解到这个云计算普惠全国的阿里云大使项目前,也有不少同学来咨询我,问我服务器该怎么买,结合他们的具体情况,我都很耐心一一为他们解答,推荐产品。还是一个偶然的机会,阿里云官方运营同学发现了我的公众号,邀请我加入阿里云大使,在此之前我也是阿里云的用户,对阿里云的产品十分信任,并且推荐新人购买还有不菲的佣金可...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Hadoop3单机部署,实现最简伪集群