算法题解:动态规划解0-1背包问题

概述

背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。

定义

我们有 n 种物品,物品 j 的重量为wj,价格为pj
我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W

如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题

如果限定物品j最多只能选择bj个,则问题称为有界背包问题

如果不限定每种物品的数量,则问题称为无界背包问题

动态规划

动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。

通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。

思路

举例,令物品数量N=5,背包所能承受的最大重量为W=10,物品与价格的对应关系如下表左三列所示。

nameweightvalue12345678910
a260666666666
b230669999999
c650669999111114
d5406699910111314
e46066991212151515

当放入物品a时,在背包所能承受的重量内,计算背包拥有的物品总价格,并进行标记,如表格第一行所示,当背包所能承受的重量大于等于2时,都可以放入物品a,背包拥有的物品总价格为6。

接着我们放入物品b,放入之前,一是要判断背包是否所能承受其重量,二是判断放入之后与放入之前拥有的物品总价格哪个最大,如表格第二行所示,当背包所能承受的重量大于等于2时,都可以放入物品b,但是,物品b在背包容量为[2,3]的时候,放入之后的总价格3不如放入之前的总价格6大,所以不放入。

当背包所能承受的重量等于4时,放入物品b后,背包所能承受的重量4减去物品b的重量2后,剩余的所能承受的重量2还可以放入物品a,此时背包拥有的物品总价格为物品a和物品b的总价格之和,即为9,大于放入之前的物品总价格6,所以此时背包拥有的物品总价格最大为9。

分析可知,在一层循环遍历下,我们需要一个一维数组保存背包所能承受的最大重量与其拥有的物品总价格,并不断更新。

代码

    /*** 0-1背包问题 ** @param N      物品数量* @param W      背包容量* @param weight 物品重量* @param value  物品价格* @return 最大价值*/private static int traceBack(int N, int W, int[] weight, int[] value) {int[] dp = new int[W + 1]; // 范围[0,W] 当前背包容量对应的物品总价值for (int i = 0; i < N; i++) { // 一件、一件的向包中放入每件物品for (int j = W; j >= weight[i]; j--) { //只要背包可以放入就放dp[j] = Math.max(dp[j - weight[i]] + value[i], dp[j]); // 比较放入物品之前与放入之后的价值哪个大}}return dp[W];}

复杂度

显而易见,算法需要的时间复杂度为O(nW),空间的消耗(即所需的一维数组)为O(W)。

转载于:https://www.cnblogs.com/yueshutong/p/11395114.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flex4中的皮肤(2): Skin State

在上一篇 中&#xff0c;定义了一个最简单的SkinnableComponent并为其定义了两个Skin。 对于TransitionSkin&#xff0c;需要在enable时有不同的展现方式&#xff0c;这可以通过Skin State实现。 对自定义的SkinnableComponent的修改 首先在组件中定义isEnabled属性&#xff1a…

休眠自动冲洗的黑暗面

介绍 既然我已经描述了JPA和Hibernate刷新策略的基础知识 &#xff0c;我就可以继续阐明Hibernate的AUTO刷新模式的令人惊讶的行为。 并非所有查询都会触发会话刷新 许多人会认为Hibernate 总是在执行任何查询之前先刷新Session。 虽然这可能是一种更直观的方法&#xff0c;并…

洛谷P1636学画画

传送 这个题我们需要一个大胆的想法&#xff08;虽然AC后看了题解知道这是个定理&#xff09; &#xff08;求证明qwq&#xff09; 如果一个图有2或0个奇点&#xff0c;它就一定可以一笔画出&#xff0c;如果不是2或0个奇点&#xff0c;那答案就是奇点数/2 &#xff08;私认为因…

理解正则

正则的应用场景很多&#xff0c;匹配过滤有价值的内容&#xff0c;所以用好正则有事半功倍的效果正则就是用有限的符号&#xff0c;表达无限的序列正则的一般语法就是两条斜线中间的就是正则主体&#xff0c;可以有许多字符表示转义字符 \是转义字符&#xff0c;简单字符表示自…

vue项目中z-index不起作用(将vue实例挂在到window上面)

问题描述&#xff1a;由于原有项目&#xff08;传统项目&#xff09;中嵌入新的vue组件&#xff0c;dialog弹出框的z-index&#xff1a;999999&#xff1b;任然不起作用&#xff1b; 解决办法&#xff1a;将vue实例挂载到window 解决代码如下&#xff1a; 入口文件index.js中 i…

【算法】称骨算命法

称骨算命法是唐代著名的星象预测家袁天罡称骨的预测方法。这种方法同四柱算命一样&#xff0c;能确定一个人一生的吉凶祸福、荣辱盛衰&#xff0c;准确率很高&#xff0c;又便于掌握和运用。 一个人出生的年、月、日、时各有定数&#xff0c;年、月、日、时的重量都有具体规定。…

IDE:5个最喜欢的NetBeans功能

愉快的发展……。 NetBeans具有许多有趣的功能 &#xff0c;这些功能使开发非常容易&#xff0c;只需很少的步骤&#xff0c;并且可以在非常快速地将产品推向市场的情况下提供高产的环境 。 将我的谈话仅限于五个功能非常困难&#xff0c;而此IDE具有大量有趣的功能。 但是在…

flask总结之session,websocket,上下文管理

1.关于session flask是带有session的&#xff0c;它加密后存储在用户浏览器的cookie中&#xff0c;可以通过app.seesion_interface源码查看 from flask import Flask,sessionapp Flask(__name__)app.secret_key aptx4869 # 必须要指定这个参数app.route(/login)def login():…

Hbase 和 RDBMS的区别

一 Hbase是个什么东西&#xff1f; 首先我们来看看两个概念&#xff0c;面向行存储和面向列存储。面向行存储&#xff0c;我相信大伙儿应该都清楚&#xff0c;我们熟悉的RDBMS就是此种类型的&#xff0c;面向行存储的数据库主要适合于事务性要求严格场合&#xff0c;或者说面向…

css设置背景透明度

设置背景透明用&#xff1a; background-color: rgba(0, 0, 0, 0.4);虽然opacity:0.5;也可以设置背景透明&#xff0c;但是会影响整体&#xff1b;推荐使用rgba设置背景透明&#xff0c;只会在当前的内容内起作用转载于:https://www.cnblogs.com/phermis/p/11395227.html

Hibernate延时加载

首先说明Hibernate3延迟加载只对load,get,find一些内值方法有用&#xff0c;对hql等写sql的无效。延迟加载机制是为了避免一些无谓的性能开销而提出来的&#xff0c;所谓延迟加载就是当在真正需要数据的时候&#xff0c;才真正执行数据加载操作。在Hibernate中提供了对实体对象…

深入了解Oracle IDM审核

在处理敏感信息的任何产品中&#xff0c; 报告都是至关重要的功能。 同样适用于身份和访问管理工具。 Oracle IDM的审核模块是其OOTB报告功能的基础。 让我们快速看一下审核引擎以及它如何促进OIM中的报告功能。 这里展示的用例很简单– 在OIM中更改为用户记录。 从审核的角度…

c#---ref参数

员工基本工资为5000元&#xff0c;奖金方法500元&#xff0c;调用该方法之后为什么工资还是5000元&#xff1f; static void Main(string[] args){double salary 5000;jiangJin(salary);Console.WriteLine(salary);Console.ReadKey();}public static void jiangJin(double sal…

django批量form表单处理

1.应用说明 一般在表单信息录入中&#xff0c;如果存在许多重复提交的信息&#xff0c;我们就需要进行批量处理&#xff0c;比如学生信息的批量录入。 这里一种方式就是使用xlrd模块处理&#xff0c;把学生信息录入到系统内 另外一种方式就是采用我们from组件中提供的formset来…

手写弹出框,设置遮罩,布局设计。

传统的设计弹出框和遮罩 <template> <div> <div class"这里是内容"> <div class"这里是遮罩"></div> </div> </div> </template> 转载于:https://www.cnblogs.com/phermis/p/11395395.html

【转】一步一步教你远程调用EJB

一步一步教你远程调用EJB http://www.diybl.com/course/1_web/webjs/20071226/94785.htmlwww.diybl.com 时间&#xff1a;2007-12-26 作者:佚名 编辑:本站 点击&#xff1a; 686 [评论]前期准备&#xff1a;弄清楚weblogic&#xff08;或jboss&#xff09;、tomcat、JBluder…

ADF:弹出窗口,对话框和输入组件

在本文中&#xff0c;当我们有一个af&#xff1a;popup包含af&#xff1a;dialog并在其中包含输入组件时&#xff0c;我想着重介绍一个非常常见的用例。 在实现此用例时&#xff0c;需要注意一些陷阱。 让我们考虑一个简单的示例&#xff1a; <af:popup id"p1" …

关于codeforces加载慢

昨天cdx报名cf&#xff0c;打开网页10多分钟才交了、、、。 今天问了wxy&#xff0c;百度了一下&#xff0c;以前也搜过&#xff0c;然后就忘记了。 今天记一下。 1.右键单击开始按钮&#xff0c;打开资源管理器&#xff0c;在资源管理器的地址栏中填写“%SystemRoot%\System3…

ORM 开发环境之利器:MVC 中间件 FreeSql.AdminLTE

前言 这是一篇纯技术干货的分享文章&#xff0c;FreeSql 已经基本完成 .NETCore 最方便的 ORM 使命&#xff0c;我们正在筹备生态的建立&#xff0c;比如 ABP 中如何使用 FreeSql 的实现&#xff0c;需要各种各样的扩展包&#xff0c;好多好多工作量。有没有大神愿意无偿参与做…

Hadoop Ecosystem解决方案---数据仓库

个人总结的一套基于hadoop的海量数据挖掘的开源解决方案.BI系统:Pentahopentaho是开源的BI系统中做得算顶尖的了.提供的核心功能如下:报表功能: 可视化(client, web)的报表设计. 分析功能: 可以生成分析视图&#xff0c;作数据作动态分析. Dashboard功能: 可以定制动态图…