01背包问题的js解决方式
如果你有兴趣看这个相信你已经对背包问题有所了解,所以关于背包问题的描述,我就不写了。
只记录一下自己对这个问题的一些看法和思考,于我而言,这个东西现在困扰我的是如何确定最优解。
实质上关于背包问题网上的东西我大体都有看过,对于这个问题,常见的就是使背包重量动态增长,然后遍历每个要装入的这些包裹,当包裹的重量小于等于当前背包的重量时,就可以装进背包了,那应不应该把当前这个包裹装入呢,这取决于 装入这个包裹,和未装入这个包裹的时候哪个状态的背包的价值最大,所以,背包问题的关键是‘01’,要么装,要么不装。
然后问题来了,未装入这个包裹的时候,这个时候的背包的最大的价值在哪里呢?
首先,在背包重量逐渐增大至与最小包裹相等的时候,这个时候就出现了第一个最优解(背包里物品最大值),因为在他前边这个背包里是没有任何东西的,我们需要把它保存下来,怎么保存呢?以当前背包的重量为行标,当前包裹的序列为列标将其存到一个二维数组里,这样做了之后,在决定要不要将当前包裹扔进背包的时候,可以比较一下装进这个包裹和不装这个包裹时候背包的最优解,保存结果的那个二维数组行标减去当前包裹的重量,and列标减一 就是 当前包裹的前几个包裹扔进这个背包能获得的最优解,而有一个数学关系是始终成立的,就是: 当前背包的重量 - 当前包裹的重量 这个差值 确定的行标,如果该行存在,那么这个行数是 >= 0 的, 所以 当前背包的重量 >= 当前包裹的重量,这也就确定了我们现在的背包是可以装的下我们正在遍历的包裹的。
写一段试试吧:
/**
*
* @param {Array} items 包裹尺寸集
* @param {Array} values包裹价值集
* @param {number} bagSize 背包尺寸
* @return {Array} 返回遍历后的数组,最优解在该数组的最后一个元素上
*/
function mostPrecious( items,values,bagSize ){
let result = [];
for( let size = 0 ; size <= bagSize; size++){
result[size] = [];
for( let item = 0; item < items.length; item++ ){
if( size == 0 ){//背包尺寸为0装不下任何东西
result[size][item] = 0;
continue;
}
if( size - items[item] < 0 ){//当前重量的背包无法装下当前包裹,那么最优解的值就是前一个包裹能装进去的价值
result[size][item] = result[size][item-1] || 0;
continue;
}
if( size - items[item] >= 0 )
{
result[size][item] = Math.max( (result[ size - items[item] ][item-1]|| 0) + values[item],result[size][item-1] || 0 )
}
}
}
return result;
}
今天先写到这儿 bug 不断啊。。。
明天再改 --- debug 2017-12-14---------
明天记录一下改bug中的心得,现在这个算法已经ok了
貌似没问题了 ---debug 2017-12-14 晚上-------
后记
回答一下开头提出的问题,为什么这么做就能确定最优解呢?
因为背包重量是由零开始动态增长的,这样保证了,当背包重量与包裹里最小的重量相等的时候,结果集所确定的第一个结果的绝对正确性,往后背包重量继续增长的时候,确定当前包裹是否要加入背包时所参考的前一个的最优解值总是正确的,也就保证了整个算法的正确性。
最后就是:决定要不要加入当前这个包,取决于,加入这个包之前的包裹能确定的最优解,加上这个包的value 和没加入这个包之前的背包的最优解谁更大。
01背包问题的js解决方式的更多相关文章
- 近期在调用 calendar.js 的时候出现中文乱码! 解决方式
近期写一个小项目的时候:在调用 calendar.js 的时候出现中文乱码! 如图所看到的: 原因在于: 我的jsp 页面,指定的是 UTF-8 编码,然而,调用的 calendar.js 的编码确 ...
- js replace 全局替换 以表单的方式提交参数 判断是否为ie浏览器 将jquery.qqFace.js表情转换成微信的字符码 手机端省市区联动 新字体引用本地运行可以获得,放到服务器上报404 C#提取html中的汉字 MVC几种找不到资源的解决方式 使用Windows服务定时去执行一个方法的三种方式
js replace 全局替换 js 的replace 默认替换只替换第一个匹配的字符,如果字符串有超过两个以上的对应字符就无法进行替换,这时候就要进行一点操作,进行全部替换. <scrip ...
- html5的postmessage实现js前端跨域訪问及调用解决方式
关于跨域訪问.使用JSONP的方法.我前面已经demo过了.详细见http://supercharles888.blog.51cto.com/609344/856886,HTML5提供了一个很强大的A ...
- 【优化算法】变邻域搜索算法解决0-1背包问题(Knapsack Problem)代码实例 已
01 前言 经过小编这几天冒着挂科的风险,日日修炼,终于赶在考试周中又给大家更新了一篇干货文章.关于用变邻域搜索解决0-1背包问题的代码.怎样,大家有没有很感动? 02 什么是0-1背包问题? 0-1 ...
- Python基于回溯法解决01背包问题实例
Python基于回溯法解决01背包问题实例 这篇文章主要介绍了Python基于回溯法解决01背包问题,结合实例形式分析了Python回溯法采用深度优先策略搜索解决01背包问题的相关操作技巧,需要的朋友 ...
- Django和Angular.js模板标签冲突的解决方式
参考文章:http://yanhua365.lofter.com/post/b417f_1f0361 http://stackoverflow.com/questions/8302928/angula ...
- python实现贪婪算法解决01背包问题
一.背包问题 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn.01背包是背包问题中最简单的问题.01背包的约束条件是给定几种物 ...
- Atitit.dwr3 不能显示错误具体信息的解决方式,控件显示错误具体信息的解决方式 java .net php
Atitit.dwr3 不能显示错误具体信息的解决方式,控件显示错误具体信息的解决方式 java .net php 1. Keyword/subtitle 1 2. 使用dwr3的异常convert处 ...
- 01背包问题(动态规划)python实现
01背包问题(动态规划)python实现 在01背包问题中,在选择是否要把一个物品加到背包中.必须把该物品加进去的子问题的解与不取该物品的子问题的解进行比較,这样的方式形成的问题导致了很多重叠子问题, ...
- 动态规划专题 01背包问题详解 HDU 2546 饭卡
我以此题为例,详细分析01背包问题,希望该题能够为大家对01背包问题的理解有所帮助,对这篇博文有什么问题可以向我提问,一同进步^_^ 饭卡 Time Limit: 5000/1000 MS (Java ...
随机推荐
- 正确处理 CSV 文件的引号和逗号
CSV(Comma-Separated Values,逗号分割值),就是用纯文本的形式存储表格数据,最大的特点就是方便. 作为开发,我们经常面临导数据的问题,特别是后台系统,产品或者运营的同事常常会提 ...
- Hive安装与启动
一.mysql安装 在配置Hive之前一般都需要安装和配置MySQL,因为Hive为了能操作HDFS上的数据集,那么他需要知道数据的切分格式,如行列分隔符,存储类型,是否压缩,数据的存储地址等信息. ...
- Java与PHP的区别
1.PHP暂时不支持像Java那样的JIT运行时编译的热点代码,但PHP具有opcache机制,能够将脚本对应的opcode缓存在内存中. 补充:JIT与JVM的三种执行模式:解释模式.编译模式.混合 ...
- Vue报错:Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location
错误原因,我猜测多半是版本问题 在router/index.js中添加如下代码 const originalPush = VueRouter.prototype.push VueRouter.prot ...
- start_HTTPServer
alias alias wser='sh /Users/enzhao/suanec/libs/envs/start_HTTPServer.sh' /Users/enzhao/suanec/libs/e ...
- 因为此网站发送了 Google Chrome 无法处理的杂乱凭据
原文地址 thisisunsafe this is unsafe 这是不安全的,呵呵~ 具体描述 在chrome该页面上,直接键盘敲入这11个字符:thisisunsafe (鼠标点击当前页面任意位置 ...
- SNAT与DNAT原理及应用
SNAT与DNAT原理及应用 当内部地址要访问公网上的服务时(如httpd访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网 ...
- API数据接口的应用步骤
API(Application Programming Interface)是现代软件应用程序开发中的一项重要技术,它允许不同的应用程序之间进行通信和数据交换.API接口通过提供统一的访问点,使得应用 ...
- ShardingSphere实战
前言 本文主要从sharding最新版本5.1.2版本入手搭建,按主键ID和时间进行分表. 本文主要介绍搭建过程,有兴趣了解shardingsphere的同学可以先自行查阅相关资料. shardsph ...
- 分享一个 SpringBoot + Redis 实现「查找附近的人」的小技巧
前言 SpringDataRedis提供了十分简单的地理位置定位的功能,今天我就用一小段代码告诉大家如何实现. 正文 1.引入依赖 <dependency> <groupId> ...