背包(二维数组版和一维数组版)

一:前言

这是动态规划的经典题型,那么我们也是 按照动态规划五步走的策略分析的

  • 确定dp数组的含义以及下标的含义
  • 确定dp数组的递推公式
  • 确定dp数组的初始化
  • 确定dp数组的遍历顺序
  • 举例验证(如果不是做题可省略)

二:二维数组

1:示例

在这里插入图片描述

2:dp数组的含义

**dp[i][j]**表示的是物品[0,i]放入背包容量为j的时候最大价值

3:确定dp数组的递推公式

dp[i][j] = max(dp[i-1][j], value[i] + dp[i-1][j-weight[i]])

在这里插入图片描述

4:初始化

在这里插入图片描述

5:遍历顺序


for(int i = 1; i < weight.size(); i++) {//物品数量  从1开始是因为我们的 我们  for(int j = 0; j <= baseweight; j++) {                        //第0件物品已经初始化号了if(j < weight[i]) dp[i][j] = dp[i-1][j];else dp[i][j] = max(dp[i-1][j], value[i] + dp[i-1][j-weight[i]])}
}

在这里插入图片描述

三:一维数组版

1:如何从二维数组变化到一维数组

因为我们是可以压缩二位数组的,二维数组中的dp[i-1][j] 我们可以 直接拷贝 下来为dp[i][j],
(这个意思就是我们在计算当前方格的时候 直接拿上一个放方格值拿过来,这其实就是不放物品i, 对此我们可以选择的是放入物品i后的价值+空间的价值与其进行比较)

那二维数组的递推公式: dp[i][j] = max(dp[i][j], dp[i][j - weight[i]] + value[i] );

那么基于此的话 我们可以将其转化为一维数组

即: dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
(这里的j代表的背包容量 ;
max中的两部分:dp[j]:不放物品i; dp[j - weight[i]] + value[i]:放入物品i);

2:dp数组的含义

dp[j] 代表的是背包容量为j的时候的最大价值

3:dp数组的递推公式

即: dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
(这里的j代表的背包容量;
max中的两部分:dp[j]:不放物品i; dp[j - weight[i]] + value[i]:放入物品i);

4:dp数组的初始化

将其初始化为0 因为我们需要将其中的部分为max部分

5:dp数组的遍历顺序

(1):正文

这里需要辨析正序遍历和逆序遍历

  • 正序遍历(会出现重复计算的值)
    在这里插入图片描述
  • 逆序遍历
    在这里插入图片描述
  • 说白了也就正序遍历的时候 会用到前面已经计算出来的结果 那么就会出现 重复
    那么逆序的时候,我们也是用到前面的dp,但是其还没有计算出结果初始化为0

(2):引发的问题(那为啥二维dp数组的背包重量没有逆序呢?)

一维数组:dp[j-weight[i]] + value[i]
二维数组:dp[i-1][j-weight[i]] +value[i]

  • 其实本质上就是比较放入物品i后, 剩余空间的背包容量是否会出现重复放入商品的的状况
    那么二位数组的话我们是需要先计算出上层的的表格数据(也就是前几件物品放入背包后的状况,),因为我们需要计算剩余空间的最大价值。
  • 那么我们的一维数组也是需要计算剩余空间的最大价值呀?这样逆序的话怎么计算?
    对于此的话我们要先明白这是同一件物品 在不同的j(背包容量下的价值),如果我们正序
    的话,那就相当于将同一间物品放入了不同j下的背包两次 这是 不允许的,那么逆序就会解决这一切;只要保证了我们同一件物品在不同的j下的正确结果,那么我们才能计算出正确的dp[j]供 dp[j-weight] (求剩余空间的最大价值用)

(3):上码

   vector<int>dp(n+1;//总共有n件物品for(int i = 0; i < weight.size(); i++) {//遍历物品for(int j = baseWeight; j >= weight[i];  j--) {//这里我们只遍历到weight[i]//是因为如果背包的容量小于weight[i]//的话那么我们是装不下的   dp[j] = max(dp[j],dp[j-weight[i]] + value[i])}}

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

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

相关文章

Azure App Service 健康检查正式发布

点击上方蓝字关注“汪宇杰博客”原文&#xff1a;Jason Freeberg, Suwat Bodin翻译&#xff1a;汪宇杰导语通过App Service&#xff0c;可以在流量增加时自动将应用程序自动扩展到多个实例。这样可以提高您应用的吞吐量&#xff0c;但是如果其中一个实例发生未捕获的异常怎么办…

Azure Cosmos Db 介绍及演示

Azure Cosmos DB 是 Microsoft 提供的全球分布式多模型数据库服务。Cosmos DB是一种NoSql数据库&#xff0c;但是它兼容多种API。它支持SQL, MongoDB、Cassandra或 Gremlin&#xff0c;你可以挑选自己喜欢的方式进行存储跟访问。主要优势统包式全局分发凭借 Cosmos DB&#xff…

leetcode049. 最后一块石头的重量 II

一:题目 二:上码 class Solution { public:/**思路:1.分析题意只要我们将石头分为尽可能相同的两堆,他们的重量相减后剩余的重量就是最小。 物品的重量为stones[i];物品的价值也为stone[i];temp代表总重量的一半那么我们最终得到的stones[temp]:就是背包容量为temp的最大重量为…

大改革,GNOME 3.x将直接跳到GNOME 40

GNOME 3.38 发布后&#xff0c;GNOME 基金会宣布了用于 GNOME 的新版本控制方案&#xff0c;将于2021年3月发布的下一版 GNOME 将是 GNOME 40。你没看错&#xff0c;版本号直接从现在的 3.x 跳到了 40。以 GNOME 40 为例&#xff0c;其开发周期将包含三个阶段&#xff0c;对应的…

.NET Core + Kubernetes:StatefulSet

在 Kubernetes 中&#xff0c;Pod 资源的控制器 Deployment、Replicaset、Daemonset 等常用于管理无状态应用&#xff0c;它们所管理的 Pod 对应的 IP、名字&#xff0c;启停顺序等都是随机的&#xff0c;Pod 之间也并不存在任何关联关系。而实际情况下&#xff0c;在应用集群部…

python编程中的小问题汇总

前言 本文记录了我在python编程中遇到的各种小问题&#xff0c;持续更新。 1. x x 1 VS x 1 辨析下面这两段代码&#xff1a; >>> x y [1, 2, 3, 4] >>> x [4] >>> x [1, 2, 3, 4, 4] >>> y [1, 2, 3, 4, 4]>>> x y …

都在讨论高并发,结果连并发量、TPS、QPS都分不清

“ 年年岁岁跳槽季&#xff0c;回回必问高并发&#xff01;原因很简单&#xff0c;因为高并发能牵扯出太多问题&#xff0c;接口响应超时、CPU负载升高、GC频繁、死锁、大数据量存储等&#xff0c;能考察求职者的真实情况。而很多人在第一步就倒下了&#xff01;因为对数据化的…

leetcode518. 零钱兑换 II

一:题目 二:上码 class Solution { public:/**思路:1.分析题意这个满足答案的结果有很多种&#xff0c;所以我们可以用动态规划去做,那么题意中我们可以知道的是我们是可以输入一种面值的时候,我们是可以重复输入的&#xff0c;那么这就是背包类型中的完全背包了2.动态规划5步…

跟我一起学.NetCore之选项(Options)核心类型简介

前言.NetCore中提供的选项框架&#xff0c;我把其理解为配置组&#xff0c;主要是将服务中可供配置的项提取出来&#xff0c;封装成一个类型&#xff1b;从而服务可根据应用场景进行相关配置项的设置来满足需求&#xff0c;其中使用了依赖注入的形式&#xff0c;使得更加简单、…

《ASP.NET Core项目开发实战入门》送书活动结果公布

截至2020.09.20 本次送书活动《ASP.NET Core项目开发实战入门》。下面把Top 5的留言截图给大家回顾一下。以下5位同学将获赠书籍一本&#xff1a;小林子鉴静红脸先生阿星Plus以上同学请在2020年9月25日24&#xff1a;00之前加小二微信领取赠书&#xff0c;超过时间视为放弃。小…

二分查找基础概念与经典题目(Leetcode题解-Python语言)二分索引型

二分查找的定义如下&#xff08;引自Wiki&#xff09;&#xff1a; 在计算机科学中&#xff0c;二分查找算法&#xff08;英语&#xff1a;binary search algorithm&#xff09;&#xff0c;也称折半搜索算法&#xff08;英语&#xff1a;half-interval search algorithm&…

Magicodes.IE 2.3重磅发布——.NET Core开源导入导出库

在2.3这一版本的更新中&#xff0c;我们迎来了众多的使用者、贡献者&#xff0c;在这个里程碑中我们也添加并修复了一些功能。对于新特点的功能我将在下面进行详细的描述&#xff0c;当然也欢迎更多的人可以加入进来&#xff0c;再或者也很期待大家来提issues或者PR&#xff0c…

听说用 C# 写 TensorFlow 更高效?

经过半年呕心沥血的努力&#xff0c;SciSharp STACK终于把Tensorflow .NET绑定升级到可以使用 tensorflow 2.3, 新版本最大的优势是实现了Eager模式, 这个特性是让.NET C#/ F#成为机器学习模型开发工具的重要前置条件。NugGet包下载:https://www.nuget.org/packages/TensorFlow…

leetcode279. 完全平方数

一:题目 二:上码 class Solution { public:/**思路:1.分析题意这个就是将一个数分成几个数的和;然而的话,这几个数必须的是完全平方数,我们要求的是最少数量的完全平方数这个满足答案的有好几个;但是我们要求的是最少的数量2.动态规划五步走1>:确定dp数组的含义以及下标的含…

跟我一起学.NetCore之Options实例演示及分析

前言来啦&#xff01;来啦&#xff01;上一节一堆代码&#xff0c;是不是感觉甚是无味啊&#xff1f;没关系&#xff0c;这里结合上一节内容专注举例演示&#xff0c;绝不废话&#xff01;走起~~~~~正文老规矩&#xff0c;一个WebApi项目走起&#xff0c;项目结构如下&#xff…

leetcode139. 单词拆分

一:题目 二:上码 class Solution { public:/**思路:1.分析题意单词就是物品;字符串就是背包;单词能否组成字符串就是在问,物品能不能将背包装满单词可以重复使用那么说明这是一个完全背包2.动态规划五步走1>:确定dp数组的与下标的含义&#xff08;这里用下标i是由我们的遍历…

大数据下的质量体系建设

一、背景大数据、人工智能是当前也是未来几年IT部门的重点建设方向&#xff0c;新的技术可以为业务突破盈利瓶颈&#xff0c;带来新的增长点&#xff0c;同时我们也发现数据中台也频频在最近的企业财报予以体现&#xff0c;相关的技术岗位需求也是供不应求&#xff0c;与之形成…

Pandas中的 transform() 结合 groupby() 用法示例

首先&#xff0c;假设我们有如下餐厅数据集&#xff1a; import pandas as pddf pd.DataFrame({restaurant_id: [101,102,103,104,105,106,107],address: [A,B,C,D, E, F, G],city: [London,London,London,Oxford,Oxford, Durham, Durham],sales: [10,500,48,12,21,22,14] })…

跟我一起学.NetCore之日志(Log)模型核心

前言鲁迅都说&#xff1a;没有日志的系统不能上线(鲁迅说&#xff1a;这句我没说过&#xff0c;但是在理)&#xff01;日志对于一个系统而言&#xff0c;特别重要&#xff0c;不管是用于事务审计&#xff0c;还是用于系统排错&#xff0c;还是用于安全追踪.....都扮演了很重要的…

Numpy中数组创建函数的辨析

首先推荐Numpy官方的教程&#xff0c;网址。 很多人会对数组创建函数的参数中什么时候要用括号np.zeros((2, 3))&#xff0c;什么时候不用括号np.eye(3, 5)感到疑惑&#xff0c;这里对它们统一进行梳理。&#xff08;按照官方文档的分类方法&#xff09; 1. 一维数组创建函数…