当前位置: 首页 > news >正文

做机械产品用什么网站辽宁seo推广

做机械产品用什么网站,辽宁seo推广,关于自行建设门户网站的请示,专注七星彩网站开发01背包除了可以用形象的二维动态数组表示外,还可以使用空间复杂度更低的一维滚动数组。 目录 文章目录 前言 一、滚动数组的基本理解 二、确定dp及其下标含义 三、确定递推公式 四、确定初始化 五、确定遍历顺序 1.用物品(正序)遍历背…

        01背包除了可以用形象的二维动态数组表示外,还可以使用空间复杂度更低的一维滚动数组。

目录

文章目录

前言

一、滚动数组的基本理解

二、确定dp及其下标含义

三、确定递推公式

四、确定初始化

五、确定遍历顺序

1.用物品(正序)遍历背包(正序)

实现代码:

手写图解: 

2.用背包(正序)遍历物品(正序)

实现代码:

手写图解: 

3.用物品(正序)遍历背包(逆序)

实现代码:

手写图解: ​编辑

总结



前言

        晦涩难懂的滚动数组,有两个非常重要的点:①倒序②物品嵌套背包遍历


一、滚动数组的基本理解

        我对于滚动数组的理解是:

        滚动数组是基于二维数组之上产生的,之所以滚动数组能够用一维的方式去完成和二维同样的工作,原因就是在于这个滚动数组能够重复产生数据,进而有“滚动”的效果。

        滚动数组的本质还是二维数组,只是数据不再产生新的行,只在一行上一直进行数据的覆盖更新,因此要特别注意数据污染的情况。

二、确定dp及其下标含义

        由题意与我们将要创建的一维数组可知,dp[j]的含义是:背包容量为j时能装的最大价值。

三、确定递推公式

        与二维dp数组相同,dp[j]的状态可以由两种状态得来:

        ①拿第i件物品(拿了以后,背包容量会减,价值会增加);

        ②不拿第i件物品;

        所以可得:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);


四、确定初始化

        由递推公式可得:dp[j]是由它之前的数据得来的,也即想要知道dp[j]的数值,就需要知道dp[j-x]的数据。(x是往前推的、未定的下标)

        所以初始化只需要初始化dp[0]为0即可。(目前分析来说)

五、确定遍历顺序

        与二维数组相同的是,一维dp数组仍然需要遍历物品和背包容量两种变量,只有这样才能模拟出将物品放入背包的过程。

1.用物品(正序)遍历背包(正序)

实现代码:

for (int j = 0; j < bagCapacity; j++){for (int i = 0; i < weight.size(); i++){// 背包容量够放if (j >= weight[i]){dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}// 不够放else{dp[j] = dp[j];}}}

手写图解: 

         由此我们可以很明显地看出在一维dp数组的情况下,数据覆盖的时候会发生污染,发现了物品0被放进dp[2]两次。

        难道是遍历前后顺序不对?

2.用背包(正序)遍历物品(正序)

实现代码:

for (int i = 0; i < weight.size(); i++){for (int j = 0; j < bagCapacity; j++){// 背包容量够放if (j >= weight[i]){dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}// 不够放else{dp[j] = dp[j];}}

手写图解: 

        交换后,还是不可避免地发生了数据污染。

        由此我们可以知道:

        正序遍历的时候会将上一个物品装进背包两回,导致错误,而逆序就可保证dp[j]不受前面数据的影响(这时前面的数据仍然都是0),也就保证了每件物品只被放进去一次。

        分析到这,我们也可以知道:初始化必须让整个dp数组的值都初始化为0(后面的dp[j]不能受前面数据的影响)。

3.用物品(正序)遍历背包(逆序)

实现代码:

for (int i = 0; i < weight.size(); i++){for (int j = bagCapacity; j >= 0; j--){// 背包容量够放if (j >= weight[i]){dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}// 不够放else{dp[j] = dp[j];}}}

手写图解: 

总结

        最后我也验证了,既然遍历背包容量的时候需要倒序,那么可不可以再将倒序的背包和正序的物品颠倒位置?

运行结果:

        原因是:从后向前遍历背包容量,见到能放进去的物品就跟已经已经在背包里的价值相比较,选择大的,但是这样一来不会发生价值的相加,只是看哪个物品价值高,并且在背包容量范围内,那就放进背包成为dp[j]。

        遍历顺序在较复杂的dp题中是非常重要的一环。

http://www.hkea.cn/news/720612/

相关文章:

  • wordpress 制作下载优化关键词怎么做
  • 宁波网站建设哪个公司好百度爱采购推广怎么入驻
  • 重庆市建设工程信息网特种作业企业网站seo多少钱
  • 域名备案做电影网站制作免费个人网站
  • 公司网络营销方案优化设计七年级上册数学答案
  • 网站建设策划方案网址搜索引擎
  • 艺术培训学校系统网站怎么做百度优化是什么
  • 自己的网站做飘窗百度推广账号登录入口
  • 国内好的网站建设国内外十大免费crm软件推荐
  • 淄博品质网站建设百度销售推广
  • 网站建设学习内容网站模板哪家好
  • 建立b2b网站成本微信营销平台系统
  • 学做衣服网 缤纷网站手机百度ai入口
  • 点餐系统网站建设画质优化app下载
  • 上海都有哪些企业公司seo网站seo
  • 进一步加强政府网站建设网站建设介绍ppt
  • 做网站的设计软件上海seo推广外包
  • 中国工程局人才招聘网福建seo推广方案
  • 深圳南山做网站的公司百度投诉中心
  • 辽宁建设工程信息网业绩认定武汉网站优化公司
  • 莱芜都市人才网上海网站seo公司
  • 广州做鞋的网站怎么让某个关键词排名上去
  • 温州平阳县网站建设兼职东莞网络推广哪家公司奿
  • 做单页网站价格微信朋友圈广告在哪里做
  • 濮阳家电网站建设一般开车用什么导航最好
  • html5 图片展示网站大作设计网站
  • 河北正规网站建设比较百度一下你就知道官页
  • 企业网站建设哪家服务好福州网站关键词推广
  • 惠州悦商做网站软件开发一般需要多少钱
  • 做衣服外单网站优化大师官方正版下载