代码随想录学习Day 37

1049.最后一块石头的重量Ⅱ

题目链接

讲解链接

思路:与前一题基本一致,将所有石头分为重量最接近sum/2的两堆,碰撞之后剩下的就是最小值

动规五部曲:
1.dp数组及其下标含义:重量为j的背包所能容纳的最大价值(本题中也就是重量)为dp[j];

2.确定递推公式:dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);

3.dp数组初始化:初始化全为0即可;

4.确定遍历顺序:先遍历石头,再遍历背包;

5.打印dp数组:当stones = [2,7,4,1,8,1]时,dp = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]。

class Solution:def lastStoneWeightII(self, stones: List[int]) -> int:target = sum(stones) // 2  # 分割值为总和的一半dp = [0] * (target + 1)  # 初始化长度为target + 1的全零dp数组for i in stones:  # 先遍历石头for j in range(target, i - 1, -1):  # 再倒序遍历背包dp[j] = max(dp[j], dp[j - i] + i)return sum(stones) - 2 * dp[-1]  # 返回碰撞后所剩的值

494.目标和

题目链接

讲解链接

本题类似于回溯算法中的组合总和问题,代码如下:

class Solution:def backtracking(self, candidates, target, total, startIndex, path, result):if total == target:  # 回溯终止条件result.append(path[:])for i in range(startIndex, len(candidates)):if total + candidates[i] > target:  # 大于目标值则直接跳出循环breaktotal += candidates[i]path.append(candidates[i])self.backtracking(candidates, target, total, i + 1, path, result)total -= candidates[i]path.pop()def findTargetSumWays(self, nums: List[int], target: int) -> int:total = sum(nums)if target > total:  # 目标和大于总和说明无解return 0if (target + total) % 2 != 0:  # 目标和与总和加起来的值必须是偶数才有解,否则无解,例如目标和为3,总和为5,这时和为8,有解,若目标和为4,则无解,因为5个1不可能求出4return 0bagSize = (target + total) // 2  # 将问题转化为组合总和问题,bagSize就是新的目标和result = []nums.sort()self.backtracking(nums, bagSize, 0, 0, [], result)return len(result)

动态规划思路:假设加法的总和(nums中取加号的数)为add,减法的总和(nums中取减号的数)为sub,所以 add + sub  = sum,add - sub = target,那么:

sub = sum - add → add - sub  = (sum - add)  = target → add = (target + sum) / 2

此时问题就转化为,装满容量为 add 的背包,有几种方法

1.dp数组及其下标含义:装满容量为j的背包有dp[j]种方法; 

2.确定递推公式:已知nums[i],凑成dp[j]就有dp[j - nums[i]] 种方法。所以递推公式为:

dp[j] += dp[j - nums[i]];

3.dp数组初始化:从递推公式可以看出,在初始化的时候dp[0] 一定要初始化为1,因为dp[0]是在公式中一切递推结果的起源,如果dp[0]是0的话,递推结果将都是0。

4.确定遍历顺序:nums放在外循环,target在内循环,且内循环倒序,也就是先物品后背包。

5.打印dp数组

class Solution:def findTargetSumWays(self, nums: List[int], target: int) -> int:if abs(target) > sum(nums):  # 目标绝对值大于总和说明无解return 0if (target + sum(nums)) % 2 != 0:  # 不是偶数说明无解return 0target_sum = (target + sum(nums)) // 2  # 求出目标和(代表背包总容量)dp = [0] * (target_sum + 1)dp[0] = 1  # j等于0时初始化为1for i in nums:  # 先物品(数)for j in range(target_sum, i - 1, -1):  后背包(目标和)dp[j] += dp[j - i]  # 递推公式return dp[-1]

474.一和零

题目链接

讲解链接

本题中strs数组里的元素就是物品,不同长度的字符串就是不同大小的待装物品。而m和n相当于是一个拥有两个维度的背包

动规五部曲:

1.dp数组及其下标含义:dp[i][j]指最多有i个0和j个1的strs的最大子集的大小为dp[i][j];

2.确定递推公式:dp[i][j] 可以由前一个strs里的字符串推导出来,strs里的字符串有zeroNum个0,oneNum个1。dp[i][j] 就可以是 dp[i - zeroNum][j - oneNum] + 1。然后我们在遍历的过程中,取dp[i][j]的最大值。所以递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);

3.dp数组初始化:全部初始化为0;

4.确定遍历顺序:先物品(字符串)后背包(两个维度)

5.打印dp数组

class Solution:def findMaxForm(self, strs: List[str], m: int, n: int) -> int:dp = [[0] * (n + 1) for _ in range(m + 1)]for str in strs:zero = str.count('0')one = str.count('1')for i in range(m, zero - 1, -1):for j in range(n, one - 1, -1):dp[i][j] = max(dp[i][j], dp[i - zero][j - one] + 1)return dp[-1][-1]

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

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

相关文章

使用C#快速搭建一个在windows运行的exe应用

文章目录 一、前言1.1 编写语言需要工具1.2 选择自己需要的组件进行安装 二、新建项目1.1 新建一个 .NET4.x 的项目1.2 添加一个小案例1.3 对界面进行美化1.3.1、配置Form属性1.3.2、配置Button按钮 1.4 查看组将的相关代码 三、后记 一、前言 这是一个比较旧的内容&#xff0…

【android】json

设置第potition个数据项的view的属性 成功显示数据项,熟悉recycleview三个方法 新建页面,定义适配器,指定使用MyViewHolder类对象保存每个数据胡view组件 padding-内部边距 bold-加粗 新建类,描述新闻内容 定义组件 public i…

模拟信号转RS-485/232,数据采集A/D转换模块 YL21

特点: ● 模拟信号采集,隔离转换 RS-485/232输出 ● 采用12位AD转换器,测量精度优于0.1% ● 通过RS-485/232接口可以程控校准模块精度 ● 信号输入 / 输出之间隔离耐压3000VDC ● 宽电源供电范围:8 ~ 32VDC ● 可靠性高&…

网络安全 - ARP 欺骗原理+实验

APR 欺骗 什么是 APR 为什么要用 APR A P R \color{cyan}{APR} APR(Address Resolution Protocol)即地址解析协议,负责将某个 IP 地址解析成对应的 MAC 地址。 在网络通信过程中会使用到这两种地址,逻辑 IP 地址和物理 MAC 地址&…

如何保证数据库和缓存的一致性

背景:为了提高查询效率,一般会用redis作为缓存。客户端查询数据时,如果能直接命中缓存,就不用再去查数据库,从而减轻数据库的压力,而且redis是基于内存的数据库,读取速度比数据库要快很多。 更新…

android studio过滤日志

荣耀手机的日志有很多乱七八糟的输出 在logcat设置过滤 filter name:过滤名称随意 log tag不知道是什么 log message设置过滤的内容或者设置显示的内容 需要过滤的内容: ^(?!.*(gralloc4|InputMethodManager|tagSocket|dataspace)).*$以|分割要过滤的内容 要显…

力扣刷题记录: 1339. 分裂二叉树的最大乘积

本题是第174场周赛的 Q3,LC竞赛分为1675. 方法一. 递归(超时) 单纯使用递归对每一个节点进行遍历,代码如下: class Solution {long long ans -1; public:int maxProduct(TreeNode* root) {long long total_sum sum…

计算机网络(2) 网络层:IP服务模型

一.Internet Protocol在TCP/IP四层模型中的作用 第三层网络层负责数据包从哪里来到哪里去的问题。传输层的数据段提交给网络层后,网络层负责添加IP段,包含数据包源地址与目的地址。将添加IP段的数据包交由数据链路层添加链路头形成最终在各节点传输中所需…

Maven:一个下载jar依赖失败的问题解决方案

内部的一个jar包已经上传到了私服上,在私服管理端也能看到该jar包的完整信息,但是springboot项目引入该jar包发现死活下载不下来,报错如图: 从该错误信息中可以看到,找不到服务名是xxl-job这个的,我们要找的…

备战 清华大学 上机编程考试-冲刺前50%,倒数第3天

T1:水滴 - 模拟 这是一个经典的游戏。 在一个 𝑛𝑚 的棋盘上,每一个格子中都有一些水滴。 玩家的操作是,在一个格子中加一滴水。 当一个格子中的水滴数超过了 4,这一大滴水就会因格子承载不住而向外扩散。扩散的规…

如何将 API 管理从 Postman 转移到 Apifox

上一篇推文讲到用 Swagger 管理的 API 怎么迁移到 Apifox,有许多同学反馈说能不能介绍一下 Postman 的迁移以及迁移过程中需要注意的事项。那么今天,它来了! 从 Postman 迁移到 Apifox 的方法有两种: 导出 Postman 集合 &#x…

详细介绍如何解决vcomp140.dll丢失的步骤,分享几种vcomp140.dll修复方法

当这个vcomp140.dll文件丢失时,可能会导致相关程序运行出错甚至无法运行。很多用户可能会遇到vcomp140.dll丢失的问题,但是这并不是不可解决的困难。接下来就和大家分享几种解决vcomp140.dll丢失的方法,给大家详细的关于如何解决vcomp140.dll…

MySQL-连接查询

049-内连接之等值连接 案例:查询每个员工所在的部门名称,要求显示员工名、部门名。 select e.ename, d.dname from emp e inner join dept d on e.deptnod.deptno;注意:inner可以省略 select e.ename, d.dname from emp e join dept d on…

你的医书是假的!批评《DDD诊所——聚合过大综合症》(合集)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 (《你的医书是假的!》原文写于2023年8月,以系列文章方式发表,现合并成一篇文章) 一、说在前面 这两天在“ Thoughtworks洞见…

mask2former利用不确定性采样点选择提高模型性能

在机器学习和深度学习的训练过程中,不确定性高的点通常代表模型在这些点上的预测不够可靠或有较高的误差。因此,关注这些不确定性高的点,通过计算这些点的损失并进行梯度更新,可以有效地提高模型的整体性能。确定性高的点预测结果…

【python】tkinter GUI开发: 多行文本Text,单选框Radiobutton,复选框Checkbutton,画布canvas的应用实战详解

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Vue3使用datav3报错问题解决

报错:Failed to resolve entry for package "dataview/datav-vue3". The package may have incorrect main/module/exports specified in its package.json. 修改package.json 修改为 "module": "./es/index.mjs",

ElasticSearch基本用法

1.查询所有索引: GET _cat/indices 2.根据id查询索引里指定数据(users为索引名,1为id的值): GET users/_doc/1 3.查询索引里所有的数据(product为索引名) GET product/_search 4.局部更新指定的数据&#xff08…

细说MCU串口函数及使用printf函数实现串口发送数据的方法

目录 1、硬件及工程 2、串口相关的库函数 (1)串口中断服务函数: (2)串口接收回调函数: (3)串口接收中断配置函数: (4)非中断发送&#xff…

提取 Excel单元格文本下的超链接

在Excel中,可以使用内置的函数来提取单元格中的超链接地址。如果你有一个包含超链接的单元格,例如B1,你可以使用以下步骤来提取这个超链接: 在一个新的单元格(例如C1)中,输入以下公式&#xff…