代码随想录算法训练营Day30 | 01背包问题(卡码网46. 携带研究材料)、Leetcode416.分割等和子集
代码随想录算法训练营Day30 | 01背包问题(卡码网46. 携带研究材料)、Leetcode416.分割等和子集
一、01背包问题
相关题目:卡码网46. 携带研究材料
文档讲解:01背包问题(二维)、01背包问题(一维)
视频讲解:01背包问题(二维)、01背包问题(一维)
1. 01背包问题种类
2. 01背包问题
有 n 件物品和一个最多能背重量为 w 的背包。第 i 件物品的重量是 weight[i],得到的价值是 value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
- 例:背包最大重量为4,物品重量及价值如下:
重量 | 价值 | |
---|---|---|
物品0 | 1 | 15 |
物品1 | 3 | 20 |
物品2 | 4 | 30 |
- 思路(二维 dp 数组):
- 动规五部曲(利用二维 dp 数组):
-
确定 dp 数组以及下标的含义:需要两个维度 i ,j 分别表示物品和背包容量。dp[i][j] 表示从下标为 [0-i] 的物品里任意取,放进容量为 j 的背包,价值总和最大是多少。
把物品 0 与物品 1 放入背包的情况:
-
确定递推公式:以 dp[1][4] 的状态为例,求取 dp[1][4] 有两种情况:
- 不放物品1:背包的价值应该是 dp[0][4] ,即容量为 4 的背包,只放物品 0 的情况。
- 放物品1:背包要先留出物品 1 的容量,目前容量是 4,物品1 的重量为 3,此时背包剩下容量为 1,而容量为 1 最大价值是 dp[0][1],所以放物品1 的情况 = dp[0][1] + 物品1 的价值。
以上过程,可以抽象化如下: - 不放物品 i:背包容量为 j,里面不放物品i的最大价值是 dp[i - 1][j]。
- 放物品 i:背包空出物品 i 的容量后,背包容量为 j - weight[i],dp[i - 1][j - weight[i]] 为背包容量为 j - weight[i] 且不放物品 i 的最大价值,那么 dp[i - 1][j - weight[i]] + value[i] (物品 i 的价值),就是背包放物品 i 得到的最大价值。
递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])。
- 不放物品1:背包的价值应该是 dp[0][4] ,即容量为 4 的背包,只放物品 0 的情况。
-
dp 数组如何初始化:首先,从 dp[i][j] 的定义出发,如果背包容量 j 为0的话,即 dp[i][0],无论是选取哪些物品,背包价值总和一定为 0。其次, dp[0][j] 即:存放编号 0 的物品的时候,各个容量的背包所能存放的最大价值,这分两种情况:
- 当 j < weight[0] 的时候,dp[0][j] 应该是 0,因为背包容量比编号 0 的物品重量还小。
- 当 j >= weight[0]时,dp[0][j] 应该是value[0],因为背包容量放足够放编号 0 物品。
此时 dp 数组初始化情况如图所示:
最后,从递归公式可以看出 dp[i][j] 是由左上方数值推导出来的,则其他下标初始是什么数值都可以,因为都会被覆盖。不过一开始就统一把 dp 数组统一初始为 0更方便一些。所以 dp 数组初始化情况如图:
-
确定遍历顺序:有两个遍历的维度:物品与背包重量,先遍历物品或先遍历背包重量都可以!
- 先遍历物品,再遍历背包的过程如图所示:
- 先遍历背包,再遍历物品的过程如图所示:
- 先遍历物品,再遍历背包的过程如图所示:
-
举例推导 dp 数组:
-
- 动规五部曲(利用二维 dp 数组):
- 动态规划(二维 dp 数组)
n, bagweight = map(int, input().split())weight = list(map(int, input().split()))
value = list(map(int, input().split()))dp = [[0] * (bagweight + 1) for _ in range(n)]for j in range(weight[0], bagweight + 1):dp[0][j] = value[0]for i in range(1, n):for j in range(bagweight + 1):if j < weight[i]:dp[i][j] = dp[i - 1][j]else:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])print(dp[n - 1][bagweight])
- 思路(一维 dp 数组):在前述利用二维 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 数组):
-
确定 dp 数组的定义:dp[j] 表示容量为 j 的背包,所背的物品价值可以最大为 dp[j]。
-
确定递推公式:dp[j] 可以通过 dp[j - weight[i]] 推导出来,dp[j - weight[i]] 表示容量为 j - weight[i] 的背包所背的最大价值。dp[j - weight[i]] + value[i] 表示 容量为 [j - 物品i重量] 的背包 加上 物品 i 的价值。此时 dp[j] 有两个选择:
- 取本身 dp[j] ,相当于二维 dp 数组中的 dp[i-1][j],即不放物品 i。
- 取 dp[j - weight[i]] + value[i],即放物品 i。
所以递归公式为: dp[j] = max(dp[j], dp[j - weight[i]] + value[i])。
-
一维 dp 数组如何初始化:dp[0] 应该是 0,因为背包容量为 0 所背的物品的最大价值就是 0。而由递推公式可以发现 dp 数组在推导的时候一定是取价值最大的数,如果题目给的价值都是正整数则非 0 下标都初始化为 0 即可。这样才能让 dp 数组在递归公式的过程中取的最大的价值,而不是被初始值覆盖了。
-
确定遍历顺序:二维 dp 遍历的时候,背包容量是从小到大,而一维 dp 遍历的时候,背包是从大到小! 倒序遍历是为了保证物品 i 只被放入一次,如果正序遍历,那么物品 0 就会被重复加入多次!例:物品 0 的重量 weight[0] = 1,价值 value[0] = 15。
- 如果正序遍历,则有 dp[1] = dp[1 - weight[0]] + value[0] = 15,dp[2] = dp[2 - weight[0]] + value[0] = 30,此时 dp[2] 就已经是 30,意味着物品 0,被放入了两次,所以不能正序遍历。
- 如果倒序遍历,则有 dp[2] = dp[2 - weight[0]] + value[0] = 15 (dp 数组已经都初始化为0),dp[1] = dp[1 - weight[0]] + value[0] = 15,每次取得状态不会和之前取得状态重合,每种物品就只取一次。
而二维 dp 数组遍历的时候不用倒序是因为 dp[i][j] 都是通过上一层即 dp[i - 1][j] 计算而来,本层的 dp[i][j] 并不会被覆盖!不同于二维 dp 数组,一维 dp 数组需先遍历物品嵌套遍历背包容量,不可以先遍历背包容量嵌套遍历物品! 因为一维 dp 的写法,背包容量要倒序遍历,如果遍历背包容量放在上一层,那么每个 dp[j] 就只会放入一个物品,即:背包里只放入了一个物品。
-
举例推导 dp 数组:一维 dp,分别用物品0,物品1,物品2 来遍历背包,最终得到结果如下:
-
- 动规五部曲(利用一维 dp 数组):
- 动态规划(一维 dp 数组)
n, bagweight = map(int, input().split())
weight = list(map(int, input().split()))
value = list(map(int, input().split()))dp = [0] * (bagweight + 1) # 创建一个动态规划数组dp,初始值为0dp[0] = 0 # 初始化dp[0] = 0,背包容量为0,价值最大为0for i in range(n): # 应该先遍历物品,如果遍历背包容量放在上一层,那么每个dp[j]就只会放入一个物品for j in range(bagweight, weight[i]-1, -1): # 倒序遍历背包容量是为了保证物品i只被放入一次dp[j] = max(dp[j], dp[j - weight[i]] + value[i])print(dp[bagweight])
二、分割等和子集
相关题目:Leetcode416
文档讲解:Leetcode416
视频讲解:Leetcode416
1. Leetcode416.分割等和子集
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
提示:
- 1 <= nums.length <= 200
- 1 <= nums[i] <= 100
-
思路:
- 题目是要找是否可以将这个数组分割成两个子集,使得两个子集的元素和相等,那么只要找到集合里能够出现 sum / 2 的子集总和,就是可以分割成两个相同元素和子集。可以利用 01背包问题,本题要求集合里能否出现总和为 sum / 2 的子集,即有一个只能装重量为 sum / 2 的背包,商品为数字,这些数字能不能把这个背包装满。 如果每一件商品是数字的话,重量等于价值,本题可以转化为“对于承载重量为 sum / 2 的背包,所能装的价值最大是多少”。如果最大价值是 sum / 2,说明正好被商品装满了。
- 动规五部曲:
- 确定 dp 数组以及下标的含义:dp[j] 表示容量为 j 的背包,所背的物品价值最大可以为 dp[j]。如果背包所载重量为 target, dp[target] 就是装满背包之后的总价值,因为本题中每一个元素的数值既是重量也是价值,所以当 dp[target] == target 的时候,背包就装满了。
- 确定递推公式: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 数组如何初始化:首先 dp[0] 一定是 0,如果题目给的价值都是正整数那么非 0 下标都初始化为 0 即可,如果题目给的价值有负数,那么非 0 下标就要初始化为负无穷。这样才能让 dp 数组在递推的过程中取得最大的价值,而不是被初始值覆盖了。
- 确定遍历顺序:如果使用一维 dp 数组,物品遍历的 for 循环放在外层,遍历背包的 for 循环放在内层,且内层 for 循环倒序遍历!
- 举例推导 dp 数组:以输入 [1,5,11,5] 为例,如图:
-
动态规划(卡哥)
class Solution:def canPartition(self, nums: List[int]) -> bool:_sum = 0# dp[i]中的i表示背包内总和# 题目中说:每个数组中的元素不会超过 100,数组的大小不会超过 200# 总和不会大于20000,背包最大只需要其中一半,所以10001大小就可以了dp = [0] * 10001for num in nums:_sum += num# 也可以使用内置函数一步求和# _sum = sum(nums)if _sum % 2 == 1:return Falsetarget = _sum // 2# 开始 0-1背包for num in nums:for j in range(target, num - 1, -1): # 每一个元素一定是不可重复放入,所以从大到小遍历dp[j] = max(dp[j], dp[j - num] + num)# 集合中的元素正好可以凑成总和targetif dp[target] == target:return Truereturn False###简化
class Solution:def canPartition(self, nums: List[int]) -> bool:if sum(nums) % 2 != 0:return Falsetarget = sum(nums) // 2dp = [0] * (target + 1)for num in nums:for j in range(target, num-1, -1):dp[j] = max(dp[j], dp[j-num] + num)return dp[-1] == target
- 二维 dp
class Solution:def canPartition(self, nums: List[int]) -> bool:total_sum = sum(nums)if total_sum % 2 != 0:return Falsetarget_sum = total_sum // 2dp = [[False] * (target_sum + 1) for _ in range(len(nums) + 1)]# 初始化第一行(空子集可以得到和为0)for i in range(len(nums) + 1):dp[i][0] = Truefor i in range(1, len(nums) + 1):for j in range(1, target_sum + 1):if j < nums[i - 1]:# 当前数字大于目标和时,无法使用该数字dp[i][j] = dp[i - 1][j]else:# 当前数字小于等于目标和时,可以选择使用或不使用该数字dp[i][j] = dp[i - 1][j] or dp[i - 1][j - nums[i - 1]]return dp[len(nums)][target_sum]
- 一维 dp
class Solution:def canPartition(self, nums: List[int]) -> bool:total_sum = sum(nums)if total_sum % 2 != 0:return Falsetarget_sum = total_sum // 2dp = [False] * (target_sum + 1)dp[0] = Truefor num in nums:# 从target_sum逆序迭代到num,步长为-1for i in range(target_sum, num - 1, -1):dp[i] = dp[i] or dp[i - num]return dp[target_sum]
相关文章:
代码随想录算法训练营Day30 | 01背包问题(卡码网46. 携带研究材料)、Leetcode416.分割等和子集
代码随想录算法训练营Day30 | 01背包问题(卡码网46. 携带研究材料)、Leetcode416.分割等和子集 一、01背包问题 相关题目:卡码网46. 携带研究材料 文档讲解:01背包问题(二维)、01背包问题(一维…...
opencv 形态学变换
形态学变换 1. 核2.腐蚀(cv2.erode)3. 膨胀(cv2.dilate)4. 开运算(cv.MORPH_OPEN)5. 闭运算(cv2.MORPH_CLOSE)6. 礼帽运算(找出增多的白色区域)7. 黑帽运算8.…...
视频设备轨迹回放平台EasyCVR打造水库大坝智慧安防视频监控智能分析方案
一、项目背景 水库安全度汛是全国防汛抗洪工作的重点,水库监控系统对保障水库安全、及时排险意义重大。多数水库站点分散、位置偏,地形复杂,与监控中心相隔较远。 传统有线监控系统成本高、工期长,遇山河等阻碍时布线困难&…...
使用 LLaMA-Factory 对 DeepSeek R1进行微调教程
如本教程有问题,感谢大家在评论区指出。 如操作过程中遇到解决不了的问题,可以在评论区提问,作者看到了会回复。 微调简介 模型微调通过在特定任务数据集上继续训练预训练模型来进行,使得模型能够学习到与任务相关的特定领域知识…...
【Kubernetes基础--Pod深入理解】--查阅笔记2
深入理解Pod 为什么要有个Pod1. 容器协作与资源共享2. 简化调度和资源管理3. 设计模式支持 Pod 基本用法Pod 容器共享 VolumePod 的配置管理ConfigMap 概述创建 ConfigMap 资源对象在 Pod 中使用 ConfigMap使用 ConfigMap 的限制条件 为什么要有个Pod Pod 的引入并非技术冗余&…...
C语言进阶之自定义类型:结构体,枚举,联合
结构体 结构体类型的声明 结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 结构的声明 struct tag{member-list;}variable-list;例如描述一个学生: struct Stu{char name[20];//名字int age;//年龄ch…...
深入解析C++引用:安全高效的别名机制及其与指针的对比
一、引用的核心概念 1.1 引用定义 引用(Reference)是C为变量创建的别名,通过&符号声明。其核心特性: 指针适用场景: 现代C黄金法则: "引用是指针的安全马甲,而智能指针是带着安全帽的…...
【rdma通信名词概念】
rdma通信名词概念 1.在rdma网卡中,QP(SQ和RQ)、CQ、EQ和SQR的含义是什么以及功能是什么?2 PCIe中的MSI-X中断机制? 1.在rdma网卡中,QP(SQ和RQ)、CQ、EQ和SQR的含义是什么以及功能是什么? QP:queue pair&am…...
Mysql主从复制有哪些方式
MySQL 主从复制主要有以下几种方式,根据不同的分类标准(如同步机制、数据复制格式、拓扑结构等)可以分为: 一、按同步机制分类 1. 异步复制 (Asynchronous Replication) 原理:主库提交事务后,立即返回给客…...
Vue工程化开发脚手架Vue CLI
开发Vue有两种方式 核心包传统开发模式:基于html / css / js 文件,直接引入核心包,开发 Vue。工程化开发模式:基于构建工具(例如:webpack)的环境中开发Vue。 脚手架Vue CLI Vue CLl 是 Vue 官方…...
MySQL函数运算
1.日期时间函数 查询当前日期时间的函数(使用函数需要加select): curdate() 查看当前数据库的日期部分(年月日) SELECT CURDATE(); curtime() 查看当前数据库的时间部分(时分秒) SELECT CURTIME(); now() 查看当前…...
Spring如何解决项目中的循环依赖问题?
目录 什么是循环依赖? 如何解决? 采用两级缓存解决 需要AOP的Bean的循环依赖问题? 三级缓存解决 什么是循环依赖? 循环依赖就是Spring在初始化Bean时两个不同的Bean你依赖我,我依赖你的情况 例如A依赖B…...
【Pandas】pandas DataFrame itertuples
Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法DataFrame.loc用于基于标签(行标签和列标签&#…...
正则表达式反向引用的综合应用魔法:从重复文本到简洁表达的蜕变
“我....我要....学学学学....编程 java!” —— 这类“重复唠叨”的文本是否让你在清洗数据时头疼不已? 本文将带你一步步掌握正则表达式中的反向引用技术,并结合 Java 实现一个中文文本去重与清洗的实用工具。 结合经典的结巴实例。如何高效地将这样的…...
ESP32驱动读取ADXL345三轴加速度传感器实时数据
ESP32读取ADXL345三轴加速度传感器实时数据 ADXL345三轴加速度传感器简介ADXL345模块原理图与引脚说明ESP32读取ADXL345程序实验结果 ADXL345三轴加速度传感器简介 ADXL345是一款由Analog Devices公司推出的三轴数字加速度计,分辨率高(13位),测量范围达…...
C++高级3 绑定器
绑定器 C11从Boost库中引入了bind绑定器和function函数对象机制 绑定器二元函数对象 一元函数对象 bind1st 绑定第一个 bind2nd 绑定第二个 #include <iostream> #include <memory> #include <vector> #include <functional> #include <ctime…...
Android 接口定义语言 (AIDL)
目录 1. 本地进程调用(同一进程内)2. 远程进程调用(跨进程)3 `oneway` 关键字用于修改远程调用的行为Android 接口定义语言 (AIDL) 与其他 IDL 类似: 你可以利用它定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。 在 Android 上,一个进…...
【android bluetooth 案例分析 02】【CarLink 详解2】【Carlink无配对连接机制深度解析】
Carlink无配对连接机制深度解析(首次/二次免鉴权原理) 一、核心结论:Carlink通过SDK层协议设计完全绕过传统蓝牙配对 传统蓝牙配对(Pairing)依赖协议栈生成长期绑定密钥(LTK),而Car…...
ubuntu 2204 安装 vcs 2023
系统 : Ubuntu 22.04.1 LTS vcs 软件 : 有已经安装好的软件(位于redhat8.10),没找到安装包 . 安装好的目录文件 占用 94 G注意 : 该虚拟机(包括安装好的软件)有114G,其中安装好的目录文件占用94GB // 即 我要把 这里 已经安装好的软件(包括scl/vcs/verdi 和其他软件) 在 …...
Spring Boot循环依赖全解析:原理、解决方案与最佳实践
🚨 Spring Boot循环依赖全解析:原理、解决方案与最佳实践 #SpringBoot核心 #依赖注入 #设计模式 #性能优化 一、循环依赖的本质与危害 1.1 什么是循环依赖? 循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系。 典…...
按键精灵安卓/ios脚本辅助工具开发教程:如何把界面配置保存到服务器
在使用按键精灵工具辅助的时候,多配置的情况下,如果保存现有的配置,并且读取,尤其是游戏中多种任务并行情况下,更是需要界面进行保存,简单分享来自紫猫插件的配置保存服务器写法。 界面例子: …...
【厦门大学】大模型概念、技术与应用实践
大模型概念、技术与应用实践 引言一、人工智能发展简史1.1 图灵测试的提出1.2 人工智能的诞生1.3 人工智能的发展阶段 二、大模型的核心概念2.1 大模型的定义2.2 大模型的特点 三、大模型的发展历程3.1 萌芽期(1950-2005)3.2 沉淀期(2006-201…...
The Strict Teacher (Hard Version) 去除无效的干扰!巧妙转化
文章目录 The Strict Teacher (Hard Version) 思考问题!那么多个人抓一个人,是否是每一个人都是对于最优策略的答案是有贡献的?答案是否定的,其实问题可以简化为三种情况: 所有的老师都在大卫的右边,…...
Linux中信号的保存
一、认识信号的其他相关概念 实际执行信号的处理动作称为信号递达 信号从产生到递达之间的状态,称为信号未决 进程可以选择阻塞某个信号 被阻塞的信号产生时将保持在未决状态,直到进程解除对该信号的阻塞,才进行递达的动作 阻塞和忽略是不同的…...
2024ICPC 南京 B 生日礼物
题目: 格莱美的生日快到了,她从朋友那里得到了一个序列 A 作为礼物。这个序列只有 0 、 1 和 2 。格莱美认为这个数列太长了,因此她决定修改 A 使其更短。 从形式上看,格莱美可以执行任意数量的运算。每次她都可以从以下三种运算…...
扫地机器人进化史:从人工智障到家政王者
1996年,瑞典伊莱克斯推出的"三叶虫"开启了扫地机器人的纪元。这款售价2000美元的"初代机"工作时像喝醉的水手,随机碰撞的清扫方式让用户直呼"买了个寂寞"。谁能想到,这个当初被戏称为"人工智障"的发…...
C 语 言 --- 数 据 类 型 的 存 储
C 语 言 --- 数 据 类 型 的 存 储 空 类 型大 小 端 存 储大 端 存 储 --- 正 着 放(从 小 到 大)小 端 存 储 --- 倒 着 放(从 大 到 小) 浮 点 型 在 内 存 中 的 存 储总结 💻作 者 简 介:曾 与 你 一 …...
3.8 字符串的常用函数
重点:字符串的常用函数 #1.测试转换大小写 lower:大写->小写 upper:小写->大写 swapcase:自动将大写转小写小写转大写 print("ABC".lower()) #abcprint("abc".upper()) #ABCprint…...
事件触发控制与响应驱动控制的定义、种类及区别
一、定义 事件触发控制(Event-Triggered Control, ETC) 事件触发控制是一种基于动态条件触发的控制策略,其核心在于通过预设的事件触发条件(如系统状态误差超过阈值、特定信号到达等)来决定何时更新控制信号或进行通信…...
Android离屏渲染
写在前面 与iOS同事聊天时聊到圆角会使用离屏渲染的方式绘制,影响性能;Android上有没有不知道,学习了一下整理了这篇文章。 Android 圆角与离屏渲染(Offscreen Rendering) 一、什么是离屏渲染? 离屏渲染…...
35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…...
网络的起点:深入解析计算机网络中的网络接口层
一、什么是网络接口层? 计算机网络的 网络接口层(Network Interface Layer),在 TCP/IP模型 中处于最底层,负责将数据从计算机传输到物理网络媒介,并在此基础上确保数据的正确传输。它位于数据链路层和物理…...
智能指针(内存泄漏)
一、RALL RALL的核心概念: 资源获取即初始化:资源的分配与对象的初始化绑定在一起,资源的释放与对象的销毁绑定在一起。 不是所有智能指针都用这个思想 可以有效避免死锁问题 二、智能指针 通过将new出的对象教给有生命周期的对象处理。 在…...
秒杀秒抢系统开发:飞算 JavaAI 工具如何应对高并发难题?
秒杀、秒抢活动已成为电商促销与吸引流量的常用手段。然而,此类活动所带来的高并发访问,对系统性能构成了巨大挑战。如何确保系统在高并发场景下依然能够稳定、高效运行,成为开发者亟待解决的关键问题。飞算 JavaAI 工具作为一款功能强大的开…...
AI在代码Review中的应用试验与推广策略
一、引言 在软件开发领域,代码审查(Code Review)是保障代码质量的关键环节。传统的代码审查依赖人工,不仅效率低下,而且容易出现疏漏。随着人工智能技术的发展,AI在代码审查中的应用逐渐成为可能。近期&am…...
自定义Jackson序列化和反序列化
为什么需要自定义Jackson序列化和反序列化?下面举个例子看看就知道了 问题描述 由于 Spring Boot 内置使用的就是 Jackson JSON 框架,所以,无需引入新的依赖,仅需添加自定义配置类即可,让其支持新的日期 API Controller层的代码…...
人工智能浪潮与生成式人工智能认证(GAI认证)的登场
当ChatGPT在2023年引爆全球对话时,人类已悄然站在人工智能发展史上的关键转折点。生成式人工智能(Generative AI)不再仅仅是实验室中的技术概念,而是正在重塑内容创作、商业决策、教育医疗等领域的底层逻辑。这场技术浪潮的冲击力,不仅体现在算法模型的指数级进化上,更在…...
Redis - 讲清楚集群模式(Redis Cluster)(上)
节点与集群构建 节点组成:Redis集群由多个独立节点组成,通过CLUSTER MEET命令实现节点握手,形成集群。 握手过程: 节点A为节点B创建clusterNode结构,发送MEET消息。 节点B接收后创建节点A的clusterNode结构ÿ…...
什么是 矩阵号 ?为什么要做海外矩阵?
简单说,就是——在海外平台批量搞账号/店铺,组团赚钱! 比如这样玩👇 ● TikTok 矩阵号:5 个账号,分别做美妆、3C、家居,覆盖不同老外兴趣圈。 ● 亚马逊矩阵店铺:A 店卖手机壳&#…...
10 穴 汽车连接器的15个设计特点
汽车行业严重依赖卓越的电气系统来确保功能和可靠性。这些系统的关键组件是 10 腔连接器,它为布线和信号传输提供解决方案。制造商和工程师必须仔细评估这些连接器的设计特性,以优化性能和安全性。 本博客研究了汽车 10 腔连接器的 15 个设计特征&#…...
WHAT - 动态导入模块遇到版本更新解决方案
文章目录 一、动态导入模块二、常见原因与解决方案1. 模块 URL 错误2. 开发人员发版用户停留在旧页面问题背景解决方案思路1. 监听错误,提示用户刷新2. 使用缓存控制策略:强制刷新3. 动态模块加载失败时兜底4. 使用 import.meta.glob() 或 webpack 的 __…...
4.15学习总结
学习了IO流和相关的字符集 完成一道算法题...
THCON 2025
Crypto OTPas_ouf 用10个字符异或加密的jpg图片,通过头得到key再恢复原图 Mammoths Personnal Slot Machine 梅森旋转恢复 from pwn import * from randcrack import RandCrack from tqdm import trange context.log_level errorp remote(74.234.198.209, 33…...
Linux 深入浅出信号量:从线程到进程的同步与互斥实战指南
知识点1【信号量概述】 信号量是广泛用于进程和线程间的同步和互斥。信号量的本质 是一个非负的整数计数器,它被用来控制对公共资源的访问 当信号量值大于0的时候,可以访问,否则将阻塞。 PV原语对信号量的操作,一次P操作使信号…...
github配置ssh,全程CV
1)随便找一个文件夹右键进入git bash 2)验证是否已有公私钥文件 cd ~/.ssh ls如果不存在则生成然后获取 生成时一直回车 ssh-keygen -t rsa -C "xxxxxx.com" cd ~/.ssh cat id_rsa.pub如果存在则直接获取 cd ~/.ssh cat id_rsa.pub3)复制 4…...
MySQL——存储
一、什么是存储过程 存储过程(Stored Procedure) 是预编译并存储在数据库中的一段SQL代码集合,支持参数传递、流程控制和返回值。通过类似“方法调用”的方式执行,存储过程将复杂业务逻辑封装在数据库层,简化应用开发…...
matlab中进行海浪模型仿真
matlab中进行海浪模型仿真,采用优化处理算法,进行防止干扰的海浪算法设计 BarhPlot.m , 180 wave.m , 1649...
边缘计算与隐私计算的融合:构建数据经济的“隐形护盾“
在数据成为核心生产要素的今天,边缘计算与隐私计算的交汇正在重塑技术生态。这并非简单的技术叠加,而是一场关于数据主权、算力分配与信任机制的深度博弈。本文将从"数据流动的拓扑学"视角,探讨二者融合如何重构数字社会的基础设施…...
实现表单验证
给Form.ITem组件绑定 name和rules字段 #增加表单验证的触发事件 失焦 onblur 添加多条验证逻辑 串行验证逻辑 实现表单提交验证 获得的值的属性名由form组件中的name属性决定 如果表单验证通过自动触发属性onFinish绑定的回调函数获得提交内容 封装request模块...
图论-BFS搜索图/树-最短路径问题的解决
续上篇~图论--DFS搜索图/树-CSDN博客 先看第一次学习的博客!!👇👇👇👇 👉 有一些问题是广搜 和 深搜都可以解决的,例如岛屿问题,这里我们记dfs的写法就好啦,…...