背包问题(动态规划)

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可视化页面展示!)相关推荐

  1. JavaScript学习笔记(四)---闭包、递归、柯里化函数、继承、深浅拷贝、设计模式

    JavaScript学习笔记(四)---闭包.递归.柯里化函数.继承.深浅拷贝.设计模式 1. 匿名函数的使用场景 2.自运行 3.闭包 3.1前提: 3.2闭包 4.函数对象的三种定义方式 5.th ...

  2. B - 阿克曼函数(记忆化搜索(啊呸))

    在我的不懈努(爆)力(零)下,我把阿克曼函数的记忆化搜索用我的泥头车创出来了(啧),不过这个记忆化应该不是最优解(或者说仿?),31ms跑完小数据,说实话有点慢(确实),如果有大lao写出了正宗的记忆 ...

  3. Python 中 selenium 设置参数,不打开可视化页面,后台执行爬虫程序

    前言 在使用 selenium 浏览器渲染技术,爬取网站信息时,默认情况下就是一个普通的纯净的 chrome 浏览器,而我们平时在使用浏览器时,经常就添加一些插件,扩展,代理之类的应用.相对应的,当我 ...

  4. JavaScript 实现页面滚动动画

    先预览一下实现效果: 我们使用 CSS 来实现动画,用 JavaScript 来处理触发所需的样式.我们先来创建布局. 创建布局 我们先使用 HTML 创建页面布局,然后为需要实现动画的元素分配一个通 ...

  5. Python数据结构与算法分析 第四章 递归 贪心 动态规划bp 记忆化搜索

    递归算法也总结出 三定律  1,递归算法必须有一个基本结束条件(最小规模问题的直接解决)  2, 递归算法必须能改变状态向基本结束条件演 进(减小问题规模)  3,递归算法必须调用自身 (解决减小了规 ...

  6. 利用 JQuery的load函数动态加载页面

    利用JQuery的load函数动态加载页面 JQuery有好多Ajax函数,其中load是用来动态加载一个页面的内容到指定的dom元素上. 我们来做个例子: 做一个上下(左右)结构的页面,其中下左部分 ...

  7. Java函数式折叠,循环,记忆化效率初识

    Java函数式折叠,循环,记忆化效率初识 最近在啃函数式编程思想,真的,感觉这本书让我受益匪浅,而且很有可能,这本书锁涵盖的知识会成为我实现梦想的必不可少的基石之一. 在Java中实现函数式编程的一个 ...

  8. 数位dp 记忆化搜索java_hdu 5787 数位dp,记忆化搜索

    题意:求区间[l,r]内有多少个数符合,这个数的任意的相邻k位数(digits),这k个数都两两不相等 l,r范围是1~1e18,k是2~5 思路:数位DP,因为K<=5,我们最多需要保存下来当 ...

  9. Javascript在页面加载时的执行顺序

    一.在HTML中嵌入Javasript的方法 直接在Javascript代码放在标记对<script>和</script>之间 由<script />标记的src属 ...

最新文章

  1. react-native 支持 gif 图片
  2. 1.STM32中对LED_GPIO_Config()函数的理解(自定义)之流水灯
  3. python mac 安装pillow,关于python:安装了Pillow,但仍然得到“ImportError:没有名为PIL的模块”...
  4. 命令界面:使用Java中的动态API处理Redis
  5. 【数据结构基础笔记】【队列】
  6. 认识容器,我们从它的历史开始聊起
  7. 大选期间完成25亿推送:美国移动push平台Urban Airship架构解密
  8. 第009讲 初识css 类选择器 id选择器 html选择器
  9. lopatkin俄大神精简中文系统Windows 7 Enterprise SP1 7601.23934 x86-x64 ZH-CN PIP
  10. 1一9数字行书写法_阿拉伯数字1至9连笔
  11. 绘制圆形 和 椭圆形:边圆形 imageellipse() 、 填充圆形imagefilledellipse()
  12. 配置办公室无线路由实现ip统一具体方式
  13. js删除数组指定的某个值或元素
  14. 【Python 实战基础】如何绘制树状图展示Python数据分析师的知识结构
  15. 解析Linux中的VFS文件系统机制
  16. 将整个项目背景设为黑白色
  17. java 二维数组排序_java – 如何对二维ArrayList进行排序
  18. 阿J正传--什么是跨域?
  19. 圆通内鬼致40万条信息泄露?如何保障数据安全?它做了一个典范!
  20. 实力吸引报名! 第八届“中国软件杯”大学生软件设计大赛课工场出题受热捧...

热门文章

  1. Scala 系列(二)—— 基本数据类型和运算符
  2. 用事实告诉你企业竞争优势的企业资源判断标准
  3. NKOJ 3762 守夜人 (并查集)
  4. Java基础练习(十二)集合与数组工具类使用,BigDecimal使用,实现二分查找,快速排序
  5. qt通过Tcp和SQL实现仿qq的聊天软件
  6. MySQL密码修改不成功_Mysql 修改密码不成功(不生效)的解决办法
  7. 如何搭建自己的网站(二)
  8. 你所选择的栏目与当前模型不相符请选择白色的选
  9. 融云RongIMKit即时通讯开发(让我们聊起来)
  10. 战地1进服务器显示无法部署,战地1无法加入服务器 发生了未知错误 | 手游网游页游攻略大全...