背包问题记忆化函数实现!!(JavaScript可视化页面展示!)
背包问题(动态规划)
1.问题描述
给定n个重量为w1,….wn、价值为v1,……,vn的物品和一个承重量为W的背包,
求这些物品中最有价值的一个子集,并且要能够装到背包中
2.算法分析
在解决问题之前,为描述方便,首先定义一些变量:Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值,同时背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个物品选或不选)。
1、建立模型,即求max(V1X1+V2X2+…+VnXn);
2、寻找约束条件,W1X1+W2X2+…+WnXn<capacity;
3、寻找递推关系式,面对当前商品有两种可能性:
- 包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j);
- 还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}。
3.关键代码
3.1使用的编程语言及程序使用说明
本算法演示采用JavaScript实现逻辑和HTML、CSS可视化显示。
打开iteml1.html的文件(使用浏览器,推荐chorme)如图所示:
3.2关键代码
//背包问题记忆化
MFKnapsack:function(i,j){var value = 0;if(this.F[i][j] < 0){if (j < parseInt(this.pws[i])){//如果添加的物品比当前背包重量还大,舍弃该物品value = this.MFKnapsack(i-1,j)}else{//这里递归使用核心的公式value = this.max(this.MFKnapsack(i-1,j),parseInt(this.pvs[i])+this.MFKnapsack(i-1,j-parseInt(this.pws[i])))}this.F[i][j] = value;}return this.F[i][j];
},
//背包问题主函数
backpackmain:function(){//pws和pvs首端添加0,因为背包的记忆功能算法使用的是Weights[1..n]和Valuess[1..n]this.pws.splice(0,0,0);this.pvs.splice(0,0,0);this.idxs.splice(0,0,0)this.F = new Array(this.pws.length);//初始化值for (var i = 0; i < this.pws.length; i++) {this.F[i] = new Array(parseInt(this.backpackweight)+1)for (var j = 0; j <= parseInt(this.backpackweight); j++) {if(i==0 || j==0){this.F[i][j] = 0;//对于非0行0列置0}else{this.F[i][j] = -1;//首行首列置1}}}this.MFKnapsack(this.pws.length-1,parseInt(this.backpackweight))//输出最优子集this.things = new Array();var j = parseInt(this.backpackweight);for (var i = this.pws.length-1; i > 0; i--) {if(this.F[i][j] == this.F[i-1][j]){while(this.F[i][j] == this.F[i-1][j]){i--;//从当前值往上一格找,如果上一个值和当前格值相等的话就不用该物品}}this.ts.push("物品"+i+",")//添加物品到最优解数组j = j - this.pws[i];}
}
4.效果验证
物品重量 | 物品价值 |
---|---|
2 | 12 |
1 | 10 |
3 | 20 |
2 | 15 |
可得背包问题的矩阵:
可以从课本处验证此例子:
项目地址(欢迎白嫖!):
https://github.com/DuoRouLongShu/AlgorithmItems.git
背包问题记忆化函数实现!!(JavaScript可视化页面展示!)相关推荐
- JavaScript学习笔记(四)---闭包、递归、柯里化函数、继承、深浅拷贝、设计模式
JavaScript学习笔记(四)---闭包.递归.柯里化函数.继承.深浅拷贝.设计模式 1. 匿名函数的使用场景 2.自运行 3.闭包 3.1前提: 3.2闭包 4.函数对象的三种定义方式 5.th ...
- B - 阿克曼函数(记忆化搜索(啊呸))
在我的不懈努(爆)力(零)下,我把阿克曼函数的记忆化搜索用我的泥头车创出来了(啧),不过这个记忆化应该不是最优解(或者说仿?),31ms跑完小数据,说实话有点慢(确实),如果有大lao写出了正宗的记忆 ...
- Python 中 selenium 设置参数,不打开可视化页面,后台执行爬虫程序
前言 在使用 selenium 浏览器渲染技术,爬取网站信息时,默认情况下就是一个普通的纯净的 chrome 浏览器,而我们平时在使用浏览器时,经常就添加一些插件,扩展,代理之类的应用.相对应的,当我 ...
- JavaScript 实现页面滚动动画
先预览一下实现效果: 我们使用 CSS 来实现动画,用 JavaScript 来处理触发所需的样式.我们先来创建布局. 创建布局 我们先使用 HTML 创建页面布局,然后为需要实现动画的元素分配一个通 ...
- Python数据结构与算法分析 第四章 递归 贪心 动态规划bp 记忆化搜索
递归算法也总结出 三定律 1,递归算法必须有一个基本结束条件(最小规模问题的直接解决) 2, 递归算法必须能改变状态向基本结束条件演 进(减小问题规模) 3,递归算法必须调用自身 (解决减小了规 ...
- 利用 JQuery的load函数动态加载页面
利用JQuery的load函数动态加载页面 JQuery有好多Ajax函数,其中load是用来动态加载一个页面的内容到指定的dom元素上. 我们来做个例子: 做一个上下(左右)结构的页面,其中下左部分 ...
- Java函数式折叠,循环,记忆化效率初识
Java函数式折叠,循环,记忆化效率初识 最近在啃函数式编程思想,真的,感觉这本书让我受益匪浅,而且很有可能,这本书锁涵盖的知识会成为我实现梦想的必不可少的基石之一. 在Java中实现函数式编程的一个 ...
- 数位dp 记忆化搜索java_hdu 5787 数位dp,记忆化搜索
题意:求区间[l,r]内有多少个数符合,这个数的任意的相邻k位数(digits),这k个数都两两不相等 l,r范围是1~1e18,k是2~5 思路:数位DP,因为K<=5,我们最多需要保存下来当 ...
- Javascript在页面加载时的执行顺序
一.在HTML中嵌入Javasript的方法 直接在Javascript代码放在标记对<script>和</script>之间 由<script />标记的src属 ...
最新文章
- react-native 支持 gif 图片
- 1.STM32中对LED_GPIO_Config()函数的理解(自定义)之流水灯
- python mac 安装pillow,关于python:安装了Pillow,但仍然得到“ImportError:没有名为PIL的模块”...
- 命令界面:使用Java中的动态API处理Redis
- 【数据结构基础笔记】【队列】
- 认识容器,我们从它的历史开始聊起
- 大选期间完成25亿推送:美国移动push平台Urban Airship架构解密
- 第009讲 初识css 类选择器 id选择器 html选择器
- lopatkin俄大神精简中文系统Windows 7 Enterprise SP1 7601.23934 x86-x64 ZH-CN PIP
- 1一9数字行书写法_阿拉伯数字1至9连笔
- 绘制圆形 和 椭圆形:边圆形 imageellipse() 、 填充圆形imagefilledellipse()
- 配置办公室无线路由实现ip统一具体方式
- js删除数组指定的某个值或元素
- 【Python 实战基础】如何绘制树状图展示Python数据分析师的知识结构
- 解析Linux中的VFS文件系统机制
- 将整个项目背景设为黑白色
- java 二维数组排序_java – 如何对二维ArrayList进行排序
- 阿J正传--什么是跨域?
- 圆通内鬼致40万条信息泄露?如何保障数据安全?它做了一个典范!
- 实力吸引报名! 第八届“中国软件杯”大学生软件设计大赛课工场出题受热捧...
热门文章
- Scala 系列(二)—— 基本数据类型和运算符
- 用事实告诉你企业竞争优势的企业资源判断标准
- NKOJ 3762 守夜人 (并查集)
- Java基础练习(十二)集合与数组工具类使用,BigDecimal使用,实现二分查找,快速排序
- qt通过Tcp和SQL实现仿qq的聊天软件
- MySQL密码修改不成功_Mysql 修改密码不成功(不生效)的解决办法
- 如何搭建自己的网站(二)
- 你所选择的栏目与当前模型不相符请选择白色的选
- 融云RongIMKit即时通讯开发(让我们聊起来)
- 战地1进服务器显示无法部署,战地1无法加入服务器 发生了未知错误 | 手游网游页游攻略大全...