网站域名申请成都水高新区建设局官方网站

web/2025/10/3 5:42:34/文章来源:
网站域名申请,成都水高新区建设局官方网站,新手小白学编程,腰椎间盘突出压迫神经腿疼怎么治锻炼01背包问题 题目链接#xff1a;46. 携带研究材料 文档讲解#xff1a;代码随想录 状态#xff1a;忘了 二维dp 问题1#xff1a;为啥会想到i代表第几个物品#xff0c;j代表容量变化#xff1f; 动态规划中#xff0c;每次决策都依赖于前一个状态的结果#xff0c;在…01背包问题 题目链接46. 携带研究材料 文档讲解代码随想录 状态忘了 二维dp 问题1为啥会想到i代表第几个物品j代表容量变化 动态规划中每次决策都依赖于前一个状态的结果在背包问题中每次取物品的操作都必须考虑当前背包容量是否足够。所以使用i代表第几个物品j代表背包容量限定。而第i个物品取和不取直接影响到最大价值总和dp[i][j]。 因此dp[i][j]可以表示为在容量j的条件下取第i个物品所能得到的最大价值总和。 动态转移方程 每次状态转移需要考虑当前背包容量是否足够容纳物品i 如果当前物品i的重量 weight[i] 大于当前背包的容量j则显然无法将物品i放入背包因此 dp[i][j] 应该等于 dp[i-1][j]即不拿当前物品i时的最优解。如果当前物品i的重量 weight[i] 小于等于当前背包的容量j则可以尝试将物品i放入背包不能保证一定能放下。此时考虑两种情况 不放入物品i也就是物品i放不下否则能放下的话肯定是放入物品i后总价值更高即 dp[i][j]dp[i-1][j]和上面的情况一样放入物品i能放下物品i肯定是放入后价值更高即dp[i][j] dp[i-1][j - weight[i]] value[i]其中 value[i] 是物品i的价值。 考虑到上述情况所以递归公式 dp[i][j] max(dp[i - 1][j], dp[i - 1][j - weight[i]] value[i]); 二维dp题解 public static void testWeightBagProblem(int[] weight, int[] value, int bagSize) {// 创建dp数组int goods weight.length; // 获取物品的数量int[][] dp new int[goods][bagSize 1];// 初始化dp数组// 创建数组后其中默认的值就是0// 当背包的容量大于等于第一个物品的重量时才会将取第一个物品时最大价值设为第一个物品的价值for (int j weight[0]; j bagSize; j) {dp[0][j] value[0];}// 填充dp数组for (int i 1; i weight.length; i) {for (int j 1; j bagSize; j) {if (j weight[i]) {/*** 当前背包的容量都没有当前物品i大的时候是不放物品i的* 那么前i-1个物品能放下的最大价值就是当前情况的最大价值*/dp[i][j] dp[i - 1][j];} else {/*** 当前背包的容量不确定可以放下物品i* 那么此时分两种情况* 1、放不下,所以不放物品i* 2、放物品i* 比较这两种情况下哪种背包中物品的最大价值最大*/dp[i][j] Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] value[i]);}}}// 打印dp数组for (int i 0; i goods; i) {for (int j 0; j bagSize; j) {System.out.print(dp[i][j] \t);}System.out.println(\n);}}//这种方法初始化时,初始化了一个(m1)×(n1)的二维数组包含了额外的一行和一列用来表示没有放入任何物品时的情况。public static void testWeightBagProblem2(int[] weight, int[] value, int bagSize) {// 创建dp数组int m weight.length; // 获取物品的数量int n bagSize;int[][] dp new int[m 1][n 1]; // 创建动态规划数组行表示物品数量列表示背包容量// 填充dp数组for (int i 1; i m; i) { // 遍历物品for (int j 1; j n; j) { // 遍历背包容量if (j weight[i - 1]) { // 如果当前背包容量小于当前物品的重量则无法装入该物品dp[i][j] dp[i - 1][j]; // 当前最优解等于上一个物品的最优解} else { // 否则可以选择装入当前物品或者不装入当前物品取两者中的最大值dp[i][j] Math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] value[i - 1]);// 不装入当前物品dp[i - 1][j]// 装入当前物品dp[i - 1][j - weight[i - 1]] value[i - 1]// value[i - 1] 表示当前物品的价值}}}// 打印dp数组for (int i 0; i m; i) {for (int j 0; j bagSize; j) {System.out.print(dp[i][j] \t); // 打印每个位置的最优值}System.out.println(\n); // 换行}}优化 可以考虑用另一方式来定义dp[i][j]的含义即dp[i][j] 表示考虑前i个物品在背包容量为j时可以达到的最大价值。 那么dp[i][j]就可能从两种状态转换而来。 第一种是当前物品i放不下那么dp[i][j]dp[i−1][j]也就是继承上一个状态的最优解第二种是可以放当前物品i那么dp[i][j]dp[i−1][j−weight[i−1]]value[i]也就是在上一个状态的继承上加上当前物品i的价值 因此可以的到递推公式dp[i][j] max(dp[i][j], dp[i - 1][j - weight[i - 1]] value[i]); 优化后题解 // 使用了优化后的递推公式 dp[i][j] max(dp[i][j], dp[i - 1][j - weight[i - 1]] value[i - 1]); public static void testWeightBagProblem3(int[] weight, int[] value, int bagSize) {int length weight.length;// 创建二维数组dpdp[i][j]表示考虑前i个物品在背包容量为j时的最大价值int[][] dp new int[length 1][bagSize 1];// 遍历每个物品for (int i 1; i length; i) {// 遍历每个背包容量for (int j 1; j bagSize; j) {// 先假设不选第i个物品继承上一个状态的最优解dp[i][j] dp[i - 1][j];// 判断如果当前背包容量能够容纳第i个物品if (weight[i - 1] j) {// 考虑选择第i个物品后的最优解这里要注意value[i - 1])是第i个物品的价值因为第一行和第一列用0填充了,但是value数组是从索引0开始有意义的。dp[i][j] Math.max(dp[i][j], dp[i - 1][j - weight[i - 1]] value[i - 1]);}}} } 一维dp: 在使用二维数组的时候递推公式dp[i][j] max(dp[i - 1][j], dp[i - 1][j - weight[i]] value[i]); 其实可以发现如果把dp[i - 1]那一层拷贝到dp[i]上表达式完全可以是dp[i][j] max(dp[i][j], dp[i][j - weight[i]] value[i]);也就是上面优化后的代码。 与其把dp[i - 1]这一层拷贝到dp[i]上不如只用一个一维数组了只用dp[j]一维数组也可以理解是一个滚动数组。 在一维dp数组中dp[j]表示容量为j的背包所背的物品价值可以最大为dp[j]。此时dp[j]的状态要么是上次取完物品i-1的状态要么是加入物品i的状态。 在取物品0的时候,dp[j]会进行第一轮更新[0 15 15 15 15]在取物品1的时候,dp[j]会进行第二轮更新[0 15 15 20 35]在取物品2的时候,dp[j]会进行第三轮更新[0 15 15 20 35]所以递推公式为dp[j] max(dp[j], dp[j - weight[i]] value[i]); 左边的 dp[j]表示在更新当前容量 j 时新的 dp[j] 值。 右边的 dp[j]表示背包装不下物品i所以继承上次容量为 j 时取完物品i-1的最大价值即在未考虑物品 i 的情况下的最大价值。 右边的 dp[j - weight[i-1]] value[i]表示在当前更新之前容量为 j - weight[i-1] 时的最大价值加上当前物品 i 的价值。 为什么需要从后向前遍历 在使用一维数组 dp 时从后向前遍历容量 j 是为了避免在同一轮次中使用已经更新的值。这保证了每个物品 i 在更新时只被计算一次不会重复使用。 举个例子 物品 1: 重量 2价值 3 物品 2: 重量 3价值 4 背包容量为 5。 从前向后遍历 我们从前向后遍历容量 j 来更新 dp 数组。看看会发生什么情况。 遍历第一个物品重量 2价值 3 j 2: dp[2] max(dp[2], dp[2 - 2] 3) max(0, 0 3) 3 更新后 dp [0, 0, 3, 0, 0, 0] j 3: dp[3] max(dp[3], dp[3 - 2] 3) max(0, 0 3) 3 更新后 dp [0, 0, 3, 3, 0, 0] j 4: dp[4] max(dp[4], dp[4 - 2] 3) max(0, 3 3) 6 更新后 dp [0, 0, 3, 3, 6, 0] 从这里开始就出现问题了求dp[4]的时候使用了更新后的dp[2]的值。 j 5: dp[5] max(dp[5], dp[5 - 2] 3) max(0, 3 3) 6 更新后 dp [0, 0, 3, 3, 6, 6]求dp[5]的时候使用了更新后的dp[3]的值。 遍历第二个物品。。。。略 从后向前遍历 遍历第一个物品重量 2价值 3 j 5: dp[5] max(dp[5], dp[5 - 2] 3) max(0, 0 3) 3 更新后 dp [0, 0, 0, 0, 0, 3]这里使用的dp[2]是还没更新的值。 …略 一维dp代码 public static void testWeightBagProblem(int[] weight, int[] value, int bagSize) {int[] dp new int[bagSize 1];for (int i 0; i weight.length; i) {for (int j bagSize; j weight[i]; j--) {//因为i在更新,所以max中的dp[j]都是上一层中的dp[j],所以隐式地实现了dp[i - 1]一层拷贝到dp[i]dp[j] Math.max(dp[j], dp[j - weight[i]] value[i]);//max中的dp[j]是取上一个物品时对应容量j的最大价值}}for (int j 0; j bagSize; j) {System.out.print(dp[j] \t);}}416. 分割等和子集 题目链接416. 分割等和子集 文档讲解代码随想录 状态感觉像碰运气做出来的。。 思路 第一步读题分割成两个子集使得两个子集的元素和相等那么可以考虑先求和再除以2得到目标值。对于nums中的数字尝试不同的取值求和只要得到和为target说明一定可以分成两个和相等的子集。所以可以考虑使用背包解题。 第二步判断背包类型 背包的体积为sum / 2背包要放入的商品集合里的元素重量为 元素的数值价值也为元素的数值背包如果正好装满说明找到了总和为 sum / 2 的子集。背包中每一个元素是不可重复放入。 以上分析完我们就可以套用01背包来解决这个问题了。 第三步动规五部曲分析。 dp[j] 表示 容量为j的背包所背的物品价值最大可以为dp[j]。在本题中就是取不同的值求得最大和dp[j]。本题中如果dp[j]j就是满足条件了。01背包的递推公式为dp[j] max(dp[j], dp[j - weight[i]] value[i]);本题相当于背包里放入数值那么物品i的重量是nums[i]其价值也是nums[i]。所以递推公式dp[j] max(dp[j], dp[j - nums[i]] nums[i]);初始化取第一个数字前dp[j]都为0确定遍历顺序如果使用一维dp数组物品遍历的for循环放在外层遍历背包的for循环放在内层且内层for循环倒序遍历举例推导dp数组如果dp[j] j 说明集合中的子集总和正好可以凑成总和j 题解 // 一维dp实现 public boolean canPartition(int[] nums) {int sum 0;// 计算数组总和for (int num : nums) {sum num;}// 如果总和是奇数不可能分成两个相等的子集if (sum % 2 1) {return false;}// 目标值是总和的一半int target sum / 2;// 创建一维dp数组dp[j]表示是否存在子集和为jint[] dp new int[target 1];// 遍历所有数字for (int i 0; i nums.length; i) {// 倒序遍历所有可能的和for (int j target; j 0; j--) {// 如果当前数字小于等于目标和更新dp数组if (nums[i] j) { // 刚开始没注意到这里, 其实最好写在for循环的判断条件中, 因为使用的数字肯定不能大于目标和dp[j] Math.max(dp[j], dp[j - nums[i]] nums[i]);}}// 剪枝只要有满足条件即可提前退出if (dp[target] target) {return true;}}// 检查是否可以找到和为target的子集return dp[target] target; }二维dp题解 // 二维dp实现 public boolean canPartition(int[] nums) {int sum 0;// 计算数组总和for (int num : nums) {sum num;}// 如果总和是奇数不可能分成两个相等的子集if (sum % 2 1) {return false;}// 目标值是总和的一半int target sum / 2;// 创建二维dp数组dp[i][j]表示前i个数能否组成和为jint[][] dp new int[nums.length 1][target 1];// 遍历所有数字for (int i 1; i nums.length; i) {// 遍历所有可能的和for (int j 1; j target; j) {if (nums[i - 1] j) {// 如果当前数字大于目标和不能选当前数字继承上一个状态的结果dp[i][j] dp[i - 1][j];} else {// 否则可以选择或者不选择当前数字取两者的最大值dp[i][j] Math.max(dp[i - 1][j], dp[i - 1][j - nums[i - 1]] nums[i - 1]);}}}// 检查是否可以找到和为target的子集return dp[nums.length][target] target; }

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

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

相关文章

网站改版 总结加载wordpress外部文件

多线程 线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 (理解:应用软件中互相独立,可以同时运行的功能) 进程 进程是程序的基本执行实体。(理解&#…

电商网站建设费用如何在asp网站

在CentOS系统中,您可以使用以下工具来监控系统的运行情况: 1. top: top 是一个命令行工具,用于实时监控系统的进程、CPU、内存和负载情况。您可以使用以下命令来启动 top: top 输出 2. htop: htop 是一…

满山红厦门网站建设大连市房屋管理局官网

1、今天消费1710元 意外险 住院--集中参保 校---******----服 1220 rmB lunch 240Rmb

合肥做网站设计建设通相似的网站

源码说明PHP萌心上传直链外链网盘源码,小巧单文件,无需数据库,只需PHP运行环境即可。源码安装方法上传文件到PHP运行环境,修改index.php内的配置// 单个文件限制$max_file_size"51200";//大小指的KB,51200是…

网站建设在淘宝上以后让还让发布吗下载app软件安装

使用akshare可以很方便的获取同花顺行业列表,与每个行业对应的个股信息,流程如下: 使用ak.stock_board_industry_summary_ths()获取行业列表循环行业列表,使用ak.stock_board_industry_cons_ths()获取行业对应的个股信息 官方文…

福建建设工程设计备案网站百度网盘优化

这是敏捷开发一千零一问系列的第七篇。(之一,之二,之三,问题总目录)问题松结对编程中,师傅对徒弟安排任务时,对于有想法的徒弟提出的意见怎样解决?方案步骤0:正心&#x…

同城信息服务平台网站头部seo范例

11&#xff1a;C中有关queue常用函数的用法及其注意要项 #include<bits/stdc.h> using namespace std; int main(){queue <int> q;q.push() //在队尾插入一个元素q.pop() //删除队列第一个元素q.size() //返回队列中元素个数q.empty() //如果队列空则返回true…

ppt网站模板北京网站建设报价表

VS2022配置OpenCV环境 关于OpenCV在VS2022上配置的教程可以参考&#xff1a;VS2022 配置OpenCV开发环境详细教程 图像马赛克 图像马赛克&#xff08;Image Mosaic&#xff09;的原理基于将图像的特定区域替换为像素块&#xff0c;这些像素块可以是纯色或者平均色&#xff0c…

网站如何实现微网站添加 百度商桥

1.概述 在14.0系统ROM产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar 给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能 从而来实现所需要的功能 …

网站建设手机软件建网站需要哪些资质

文章目录 1、简介2、观察者模式简单实现抽象主题&#xff08;Subject&#xff09;具体主题&#xff08;ConcreteSubject&#xff09;抽象观察者&#xff08;Observer&#xff09;具体观察者&#xff08;ConcrereObserver&#xff09;测试&#xff1a; 观察者设计模式优缺点观察…

网站建设哪些字体没有版权阅读网站建设

1.概述 接着之前我们对Spring AOP以及基于AOP实现事务控制的上文&#xff0c;今天我们来看看平时在项目业务开发中使用声明式事务Transactional的失效场景&#xff0c;并分析其失效原因&#xff0c;从而帮助开发人员尽量避免踩坑。 我们知道 Spring 声明式事务功能提供了极其…

外贸企业网站源码下载创新的成都网站建设

为什么80%的码农都做不了架构师&#xff1f;>>> 1、公司项目需求。 用户签到活动&#xff0c;会员签到怎么处理&#xff0c;超级会员怎么处理&#xff0c;普通用户签到怎么处理&#xff0c;针对不同的档次&#xff0c;有不同的方案&#xff0c;所以在项目中用到了策…

墓地网站建设价格wordpress即阅文教程

2019独角兽企业重金招聘Python工程师标准>>> 首先在win7上安装nc命令 下载nc程序包&#xff0c;放在c盘目录下&#xff0c;cmd打开命令行&#xff0c;进入nc目录&#xff0c;执行&#xff1a;nc -l -L -p 8888开始监控。再打开一个命令行窗口进入nc目录&#xff0c;…

如何做众筹网站泉州百度推广咨询

源宝导读&#xff1a;“业务模板”作为天际建模平台3.0推出的重要特性&#xff0c;它将元数据复用发挥到了极致&#xff0c;通过业务模板几乎可以覆盖整个建模元数据开发流程&#xff0c;提供业务场景级别的复用能力。本文将介绍“业务模板”的设计原理、实现方案和应用场景。一…

萍乡网站建设公司网页图片大全

详见 集成测试,单元测试隔离 maven-surefire-plugin maven的goal生命周期 Maven生存周期 - 含 integration-test Maven本身支持的命令&#xff08;Goals&#xff09;是有顺序的&#xff0c;越后面执行的命令&#xff0c;会将其前面的命令和其本身按顺序执行一遍&#xff0c;…

网站建设化学图片哪些网站需要备案

1. 为什么要用缓存&#xff1f; 用缓存&#xff0c;主要有两个用途&#xff1a;高性能、高并发。 高性能 假设这么个场景&#xff0c;你有个操作&#xff0c;一个请求过来&#xff0c;吭哧吭哧你各种乱七八糟操作 MySQL&#xff0c;半天查出来一个结果&#xff0c;耗时 600m…

移动网站建设成都市青羊区建设局官方网站

忙碌了一周&#xff0c;一直没时间更新&#xff0c;趁着周末来更新第二个题目。 题目 题目解析 这个题目相比于上一个题目来说&#xff0c;会简单一些&#xff0c;不涉及到那些复杂的算法&#xff0c;就是对于字符串的处理。 算法步骤 输入一个字符串根据分号&#xff0c;将…

河南中安建设集团有限公司网站泗水做网站

ROS元功能包&#xff08;Metapackage&#xff09;是一种特殊的软件包&#xff0c;它本身并不包含任何可执行代码或数据文件。在ROS 1中&#xff0c;可以通过catkin_create_pkg命令创建元功能包。 相反&#xff0c;它的主要目的是作为一组相关功能包的集合或者依赖关系列表。使…

单页销售网站如何赚钱推荐10个网站

打开重要的Excel文件时遇到问题吗?Microsoft Excel是否要求你验证文件是否已损坏?Excel文件可能由于各种原因而损坏,从而无法打开。但不要失去希望;你可以轻松修复损坏的Excel文件。 更改Excel信任中心设置 Microsoft Excel有一个内置的安全功能,可以在受限模式下打开有…