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

代码随想录第30天:动态规划3

一、01背包理论基础(Kama coder 46)

“01背包”:有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

1. 确定dp数组以及下标的含义:dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少
2. 确定递推公式:
  • 不放物品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]);

3. dp数组如何初始化:

状态转移方程 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 可以看出i 是由 i-1 推导出来,那么i为0的时候就一定要初始化。

dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。

那么很明显当 j < weight[0]的时候,dp[0][j] 应该是 0,因为背包容量比编号0的物品重量还小。

j >= weight[0]时,dp[0][j] 应该是value[0],因为背包容量放足够放编号0物品。

4. 确定遍历顺序:先遍历物品和先遍历背包都可以!! 但是先遍历物品更好理解
n, bagweight = map(int, input().split())  # 输入物品数量和背包容量weight = list(map(int, input().split()))  # 输入物品的重量
value = list(map(int, input().split()))   # 输入物品的价值# 初始化 dp 数组,大小为 n 行 bagweight + 1 列
dp = [[0] * (bagweight + 1) for _ in range(n)]# 初始化第一行,即只有第一个物品时的情况
for j in range(weight[0], bagweight + 1):dp[0][j] = value[0]# 动态规划填充 dp 数组
for i in range(1, n):for j in range(bagweight + 1):if j < weight[i]:dp[i][j] = dp[i - 1][j]  # 当前容量不足以放入物品 i,保持上一行的值else:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])  # 选择放或不放物品 i# 输出最终结果
print(dp[n - 1][bagweight])  # 最大价值

1.关于DP数组初始化的大小:

在背包问题中,物品的索引从 0n-1,而不是从 1n。因此,如果你用 n 个物品,那么 dp 数组的大小应该是 n x (bagweight + 1)

  • 行数(物品数): 我们有 n 个物品,因此使用 n 行来表示每个物品。

  • 列数(背包容量): 背包的容量从 0bagweight,所以需要 bagweight + 1 列。

因此,初始化 dp数组为:

dp = [[0] * (bagweight + 1) for _ in range(n)]

2.为什么不使用 (n + 1) x (bagweight + 1)

如果使用 (n + 1) 行,而不是 n 行,实际上会多出一行。多出来的 dp[n][j] 并不会直接影响到最终结果,但它表示的状态是多余的,因为你只需要 n 行来表示 n 个物品的情况。dp[n][j] 是你已经处理过的所有物品的情况,所以对它没有额外的意义。

但 在 dp[i][j] 中,我们是以物品的数量 i 来计算状态的,所以我们可以将“没有物品”的情况作为 dp[0][j] 这一行来处理:

  • dp[0][j] 表示没有任何物品时,背包容量为 j 时的最大价值。这时,最大价值是 0,所以 dp[0][j] 全部初始化为 0

  • 空间浪费: 多余的一行并不会影响最终结果,但增加了内存使用。

  • 冗余状态: dp[n][j] 是多余的,并且它并不会在求解过程中被有效利用。

二、01背包理论基础(滚动数组)

在使用二维数组的时候,可以发现如果把dp[i - 1]那一层拷贝到dp[i]上,表达式变成:dp[i][j] = max(dp[i][j], dp[i][j - weight[i]] + value[i]);那么与其把dp[i - 1]这一层拷贝到dp[i]上,不如直接使用一个一维数组。

# 输入物品个数n和背包容量bagweight
n, bagweight = map(int, input().split())  # 输入每个物品的重量
weight = list(map(int, input().split()))  # 输入每个物品的价值
value = list(map(int, input().split()))  # 创建一个一维数组dp,dp[j] 表示背包容量为j时的最大价值,初始值为0
dp = [0] * (bagweight + 1)  # 初始化dp[0] = 0,背包容量为0时的最大价值是0
dp[0] = 0  # 遍历所有物品
for i in range(n):  # 从大到小遍历背包容量,确保每个物品只被放入一次for j in range(bagweight, weight[i] - 1, -1):  # 更新当前背包容量j的最大价值# max(当前背包容量j不放物品i的价值, 当前背包容量j放物品i的价值)dp[j] = max(dp[j], dp[j - weight[i]] + value[i])  # 最终输出背包容量为bagweight时的最大价值
print(dp[bagweight])  
for j in range(bagweight, weight[i] - 1, -1):  

倒序遍历是为了保证物品i只被放入一次,正序遍历会导致物品被重复加入多次!

例如:物品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] = dp[2 - weight[0]] + value[0] = 15 (dp数组已经都初始化为0)

dp[1] = dp[1 - weight[0]] + value[0] = 15

遍历顺序:只能先遍历物品后遍历背包,因为背包遍历时由大到小逆序的,如果先遍历背包容量,那么每个dp[j]就只会放入一个物品。

可以看出,一维dp数组的解法,代码简洁,而且空间复杂度还降低了一个数量级!

三、分割等和子集(Leetcode 416)

1. 确定dp数组以及下标的含义:如果背包所载重量为target, dp[target]就是装满 背包之后的总价值,因为 本题中每一个元素的数值既是重量,也是价值

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

3. dp数组初始化:本题题目中 只包含正整数的非空数组,所以非0下标的元素初始化为0

4. 确定遍历顺序:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历

5.dp[j]的数值一定是小于等于j的。

如果dp[j] == j 说明,集合中的子集总和正好可以凑成总和 j 。

class Solution:def canPartition(self, nums: List[int]) -> bool:total = sum(nums)#题目描述1 <= nums.length <= 200  1 <= nums[i] <= 100,#total//2最大为200*100/2=10000dp = [0] * 10001  # dp[i]表示能否凑出总和为i的子集if total % 2 != 0:return False  # 如果总和是奇数,不能平分target = total // 2  # 目标是找到一个和为total//2的子集# 0-1背包问题for num in nums:# 从大到小遍历,保证每个物品只能使用一次for j in range(target, num - 1, -1):dp[j] = max(dp[j], dp[j - num] + num)  # 当前背包容量j的最大值if dp[target] == target:  # 如果能找到和为target的子集return Truereturn False

class Solution:def canPartition(self, nums: List[int]) -> bool:# 计算数组所有元素的和total_sum = sum(nums)# 如果总和是奇数,无法均分为两个相等的部分if total_sum % 2 != 0:return False# 目标是寻找一个子集,使得其和为total_sum // 2target_sum = total_sum // 2# dp[i] 表示是否可以找到和为i的子集dp = [False] * (target_sum + 1)dp[0] = True  # 0总是可以被表示为一个空子集# 遍历数组中的每个元素for num in nums:# 从target_sum逆序迭代到num,步长为-1,防止重复使用当前元素for i in range(target_sum, num - 1, -1):dp[i] = dp[i] or dp[i - num]  # 如果dp[i-num]为True,表示可以组成ireturn dp[target_sum]  # 返回能否找到和为target_sum的子集
 dp[i] = dp[i] or dp[i - num]
  • 初始时,dp[0] = True,因为空集的和为 0

  • 对于每个物品 num,我们尝试更新 dp[i]

    假设我们已经知道某个子集的和为 i - num,那么如果我们再加入物品 num,就可以得到和为 i 的子集。所以我们用 dp[i - num] 来检查是否可以构造出和为 i 的子集。

四、最后一块石头的重量II(Leetcode 1049)

思路:一堆的石头重量是sum,那么我们就尽可能拼成 重量为 sum / 2 的石头堆。 这样剩下的石头堆也是 尽可能接近 sum/2 的重量。问题转化为:有一堆石头,每个石头都有自己的重量,是否可以装满最大重量为 sum / 2 的背包。

1. 确定dp数组以及下标的含义:dp[j] 表示重量为 j 的背包,最多可以背最大重量为dp[j]

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

3.dp数组初始化:

提示中给出1 <= stones.length <= 30,1 <= stones[i] <= 100,所以最大重量就是30 * 100 。

而我们要求的target其实只是最大重量的一半,所以dp数组开到1500大小

4. 确定遍历顺序:先遍历物品后遍历背包,且背包倒序遍历

class Solution:def lastStoneWeightII(self, stones: List[int]) -> int:total = sum(stones)  # 计算所有石头的总和dp = [0] * 1501  # 初始化 dp 数组,用于记录背包的状态target = total // 2  # 目标是求两堆石头的和尽量相等# 动态规划遍历每块石头for stone in stones:for j in range(target, stone - 1, -1):  # 从 target 到 stone 遍历,保证每个石头只能使用一次dp[j] = max(dp[j], dp[j - stone] + stone)# 返回最终结果,total - 2 * dp[target] 是求两堆石头的差return total - dp[target] * 2

dp[target] 代表能够凑成的最接近一半总和的子集的重量。剩下的石头重量为total -dp[target],两堆石头的差值为total - dp[target] - dp[target] = total - dp[target] * 2 

本题与分割等和子集基本一样。

相关文章:

代码随想录第30天:动态规划3

一、01背包理论基础&#xff08;Kama coder 46&#xff09; “01背包”&#xff1a;有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 1. 确…...

DSP48E2 的 MAC模式功能仿真

DSP48E2 仿真代码&#xff1a; 测试的功能为 P i ( A D ) ∗ B P i − 1 P_{i} (AD) * B P_{i-1} Pi​(AD)∗BPi−1​ timescale 1ns / 1nsmodule dsp_tb;// 输入reg CLK;reg CE;reg SCLR;reg signed [26:0] A, D;reg signed [17:0] B;// 输出wire signed [47:0] P;par…...

【环境配置】Mac电脑安装运行R语言教程 2025年

一、安装 Xcode Command Line Tools 打开终端&#xff0c;输入如下命令&#xff1a; xcode-select --install安装完成后&#xff0c;输入如下命令&#xff0c;能看见版本号说明安装成功 gcc --version二、下载安装R语言 https://mirrors.tuna.tsinghua.edu.cn/CRAN/ 点开后…...

常见算法的总结与实现思路

前言 hello&#xff0c;我是Maybe。昨天和今天花了两天左右的时间。把常见的排序算法都学完了&#xff0c;自己也实现了一遍。感觉收获满满&#xff0c;但是过程是艰辛的。下面我将分享代码和思维导图&#xff0c;希望可以帮助到大家。 思维导图(含注意事项&#xff0c;实现思…...

Ethan独立开发产品日报 | 2025-04-27

1. CreateWise AI 旨在提升你工作效率的AI播客编辑器 人工智能播客编辑器&#xff0c;让你的播客制作速度提升10倍&#xff01;它可以自动去除口头语和沉默&#xff0c;生成节目笔记和精彩片段&#xff0c;还能一键制作适合社交媒体分享的短视频——所有这些功能都只需一次点…...

5G与边缘计算:协同发展,开启智慧世界新篇章

**5G与边缘计算&#xff1a;协同发展&#xff0c;开启智慧世界新篇章 ** 大家好&#xff0c;我是Echo_Wish。今天我们来探讨一个备受关注的技术话题——5G与边缘计算的协同发展。随着5G网络的逐步普及以及边缘计算技术的快速发展&#xff0c;二者的结合为我们带来了前所未有的创…...

AcWing 885:求组合数 I ← 杨辉三角

【题目来源】 https://www.acwing.com/problem/content/887/ 【题目描述】 给定 n 组询问&#xff0c;每组询问给定两个整数 a&#xff0c;b&#xff0c;请你输出 C(a,b) mod (10^97) 的值。 【输入格式】 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一组 a 和 b。 …...

Python3:Jupyterlab 安装和配置

Python3:Jupyterlab 安装和配置 Jupyter源于Ipython Notebook项目&#xff0c;是使用Python&#xff08;也有R、Julia、Node等其他语言的内核&#xff09;进行代码演示、数据分析、机器学习、可视化、教学的非常好的工具。 最新的基于web的交互式开发环境&#xff0c;适用于n…...

如何搭建spark yarn模式的集合集群

一、环境准备 在搭建 Spark on YARN 集群之前&#xff0c;需要确保以下环境已经准备就绪&#xff1a; 操作系统&#xff1a;推荐使用 CentOS、Ubuntu 等 Linux 发行版。 Java 环境&#xff1a;确保安装了 JDK 1.8 或更高版本。 Hadoop 集群&#xff1a;已经搭建并运行的 Had…...

智能座舱架构中芯片算力评估

在智能座舱&#xff08;Intelligent Cockpit&#xff09;领域&#xff0c;芯片的算力是决定系统性能、响应速度以及用户体验的关键因素之一。 随着汽车智能化程度的不断提高&#xff0c;智能座舱对芯片的算力、功耗、集成度以及安全性提出了更高的要求。 智能座舱架构中芯片算…...

STM32完整内存地址空间分配详解

在STM32这类基于ARM Cortex-M的32位微控制器中&#xff0c;整个4GB的地址空间(从0x00000000到0xFFFFFFFF)有着非常系统化的分配方案&#xff0c;每个区域都有其特定的用途。下面我将详细介绍这些地址区域的分配及其功能&#xff1a; STM32完整内存地址空间分配详解(0x00000000…...

叉车司机N1考试的实操部分有哪些注意事项?

叉车司机 N1 考试实操部分分为场地考试和场内道路考试&#xff0c;以下是一些注意事项&#xff1a; 场地考试 起步&#xff1a;检查车辆仪表和个人仪容&#xff0c;穿好工作服、戴安全帽&#xff0c;不穿拖鞋等不符规定的鞋。同时检查换挡和换向操纵杆在空档位置&#xff0c;…...

【行业特化篇2】金融行业简历特化指南:合规性要求与风险控制能力的艺术化呈现

写在最前 作为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offe…...

Linux 定时备份到windows 方案比较

1 传输协议比较 特性SCPRSYNCSFTP基本功能文件传输&#xff08;本地与远程&#xff09;文件和目录的同步与传输文件管理&#xff08;上传、下载、删除等&#xff09;增量传输不支持增量传输支持增量传输不支持增量传输性能传输速度较慢&#xff0c;效率低高效&#xff0c;适合…...

【网络编程】TCP/IP四层模型、MAC和IP

1. TCP/IP的四层模型 网络模型的目的&#xff1a;规范通信标准&#xff0c;确保不同设备和系统之间能够有效通信 对比OSI模型与TCP/IP模型&#xff1a; OSI模型的七层架构&#xff08;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层&#xff09;TCP/IP模型的四…...

Java学习手册: IoC 容器与依赖注入

一、IoC 容器概述 IoC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;容器是 Spring 框架的核心组件之一。它负责创建对象、管理对象的生命周期以及对象之间的依赖关系。通过将对象的创建和管理交给 IoC 容器&#xff0c;开发者可以实现代码的松耦合&#…...

Web 基础与Nginx访问统计

目录 Web基础 域名与DNS 域名的结构 网页与HTML 网页概述 HTML 概述 HTML基本标签 1、HTML 语法规则 2、HTML 文件结构 静态网页和动态网页 HTTP协议概述 HTTP方法 HTTP状态码 Nginx访问状态统计 Web基础 域名与DNS 网络是基于 TCP/IP 协议进行通信和连接的,每一台主机都有一…...

了解Android studio 初学者零基础推荐(1)

线上学习课程链接 开发Andorid App 使用的语言有很多&#xff0c;包括java, kotlin,C,等&#xff0c;首先让我们了解kotlin这个热门语言。 kotlin 程序 fun main() {println("hello,xu") } kotlin中的函数定义语法&#xff1a;函数名称在fun关键字后面&#xff0…...

Android Studio 2024版,前进返回按钮丢失解决

最近升级完AS最新系统后&#xff0c;顶部的前进和返回按钮默认隐藏了 解决方案&#xff1a; 1. 打开settings 2. 找到左侧 Appearance & Behavior 下面点击 Menus and Toolbars 3. 点击 Main Toolar 4. 点击Left&#xff0c;右键选择 Add Actions 5. 弹框中选择 Main Me…...

详解UnityWebRequest类

什么是UnityWebRequest类 UnityWebRequest 是 Unity 引擎中用于处理网络请求的一个强大类&#xff0c;它可以让你在 Unity 项目里方便地与网络资源进行交互&#xff0c;像发送 HTTP 请求、下载文件等操作都能实现。下面会详细介绍 UnityWebRequest 的相关内容。 UnityWebRequ…...

安装qt4.8.7

QT4.8.7安装详细教程&#xff08;MinGW 4.8.2和QTCreator4.2.0)_qtcreater482-CSDN博客 QT4.8.7安装详细教程&#xff08;MinGW 4.8.2和QTCreator4.2.0) 1、下载 1&#xff09;下载QT4.8.7 http://download.qt.io/archive/ 名称&#xff1a;qt-opensource-windows-x86-mingw482…...

2025系统架构师---管道/过滤器架构风格

引言 在分布式系统与数据密集型应用主导技术演进的今天&#xff0c;‌管道/过滤器架构风格‌&#xff08;Pipes and Filters Architecture Style&#xff09;凭借其‌数据流驱动‌、‌组件解耦‌与‌并行处理能力‌&#xff0c;成为处理复杂数据转换任务的核心范式。从Unix命令…...

仙宫云ComfyUI —【Wan2.1】AI视频生成部署

【Wan2.1】AI视频生成本地部署与使用技巧全面详解_哔哩哔哩_bilibili 所有模型下载&#xff1a;https://pan.quark.cn/s/9d793aa1b258 Runninghub本期课程工作流下载&#xff08;可获得1000RH币&#xff09;&#xff1a;https://www.runninghub.cn/?utm_sourcekol01-RH145 仙…...

学成在线。。。

一:讲师管理 介绍:可以实现对讲师的分页展示,多条件组合分页查询,对讲师的添加,修改,删除操作。 针对于添加来说,使用requestBody注解,搭配postmapping接收数据,使用service层的对象,调用mapper方法,向数据库中保存数据。 修改: 先根据讲师id,查询出讲师,再去…...

Python爬虫实战:获取猫yan电影网最新热门电影数据并做分析,为51观影做参考

一、引言 随着互联网的迅速发展,电影信息获取更加便捷。猫yan电影作为国内知名电影信息平台,提供了丰富电影数据。对于我们而言,获取并分析这些数据,能为用户提供更有价值的观影建议。本文详细介绍使用 Python 的 Scrapy 框架实现猫yan电影数据爬取与分析,为 “五一” 观…...

将有序数组转换为高度平衡二叉搜索树 | 详解与Java实现

文章目录 1. 问题描述2. 方法思路核心思想:分治法 + 递归3. 代码实现Java实现(含注释)4. 复杂度分析5. 关键点解释为何选择中间节点?为何使用 `left + (right - left) / 2` 而非 `(left + right) / 2`?6. 扩展优化迭代法实现(非递归)优化空间7. 总结1. 问题描述 108.将…...

普推知产:商标驳回复审下初步审定公告了!

近日客户的商标驳回复审后终于下初审公告了&#xff0c;经过一年多时间&#xff0c;当时申请时知道这个商标名称会被驳回&#xff0c;因为有相同一模一样的&#xff0c;客户就想要这个名称&#xff0c;因为与创始人的姓名是相关的&#xff0c;普推知产商标老杨经分析后&#xf…...

网工笔记-网络层

概述&#xff1a; 两种观点&#xff1a; 1.面向连接的可靠传输 2.面向无连接的&#xff0c;尽最大努力完成交付数据报服务 虚电路服务&#xff08;可靠传输&#xff09; 数据报服务&#xff08;尽力而为&#xff09; 两者的对比&#xff1a; 不管是虚电路还是数据报服务都是…...

el-Input输入数字自动转千分位进行展示

el-Input输入数字自动转千分位进行展示&#xff0c;存储值不变 子组件&#xff1a; <template><el-input ref"inputRef" :disabled"disabled" clearable v-model"displayValue" v-bind"$attrs" input"handleInput&quo…...

基于 Spring Boot 瑞吉外卖系统开发(九)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;九&#xff09; 保存菜品 菜品管理页面提供了一个“新增菜品”按钮&#xff0c;单击该按钮时&#xff0c;会打开新增菜品页面。 请求路径/dish&#xff0c;请求方法POST&#xff0c;参数使用DishDto类接收。 DishDto 添加f…...

C++复习补充 类型转换和RTTI

类型转换和RTTI 类型转换类与类之间的类型转换四种显示类型转换类型转换注意事项RTTI 类型转换 在 C 中&#xff0c;operator int() 是用户定义的类型转换运算符&#xff08;User-Defined Conversion Operator&#xff09;&#xff0c;允许自定义对象隐式或显式转换为特定类型…...

QT采用mqtt进行通信(17.1)

文章目录 1.试错历程2. qt5.8安装3. 开始搞了4. 测试连接mqtt broker1.试错历程 尝试过网上说的各种版本,官方库和第三方库,试过qt5.9.9, qt5.12, qt5.12.2, qt5.14 等各个版本,都能编译通过,调用mqtt库,但是都不能连接成功,真的是试吐了,不知道他们的为什么都能成功,…...

基于 BERT 微调一个意图识别(Intent Classification)模型

基于 BERT 微调一个意图识别&#xff08;Intent Classification&#xff09;模型&#xff0c;你的意图类别包括&#xff1a; 查询天气获取新闻咨询想听音乐想添加备忘查询备忘获取家政服务结束对话增加音量减小音量其他 具体实现步骤&#xff08;详细版&#xff09; 1. 准备你…...

人工智能大语言模型与AI芯片新进展:技术演进与商业化路径

人工智能大语言模型与AI芯片新进展&#xff1a;技术演进与商业化路径 Latest Advances in AI Large Language Models and Chips: Technological Evolution and Commercialization Pathways 一、研究背景与意义&#xff08;Research Background and Significance&#xff09; 技…...

【Linux】Java 开发者的 Linux 常用命令指南

Java 开发者的 Linux 常用命令指南 目录标题 Java 开发者的 Linux 常用命令指南1. Linux 目录结构2. 系统信息命令3. 服务管理系统服务防火墙管理 4. 文本编辑 (vi/vim)常用模式 5. 文件和目录操作查看与导航创建与删除查看文件内容查找文件 6. 用户管理7. 压缩和解压8. 权限管…...

全开源、私有化部署!轻量级用户行为分析系统-ClkLog

ClkLog是一款支持私有化部署的全开源埋点数据采集与分析系统&#xff0c;兼容Web、App、小程序多端埋点&#xff0c;快速洞察用户访问路径、行为轨迹&#xff0c;并生成多维用户画像。助力中小团队搭建轻量灵活的用户行为分析平台。 为什么需要一款私有化的埋点分析系统&#x…...

【Mybatis】Mybatis基础

文章目录 前言一、搭建MyBatis1.1 创建maven工程1.2 加入log4j日志功能1.3 MyBatis的增删改查1.4 核心配置文件详解 二、MyBatis获取参数值的两种方式2.1 单个字面量类型的参数2.2 多个字面量类型的参数2.3 map集合类型的参数2.4 实体类类型的参数2.5 使用Param标识参数 三、 M…...

(002)Excel 使用图表,统计

第一步新建数据&#xff0c;将数据转成表格&#xff1a; 选中表格数据&#xff0c;右下角小图标&#xff1a;汇总 图表。...

云服务器主动防御策略与自动化防护(下)

三、纵深防御体系构建 1. 系统层防护 # 自动安全更新配置 sudo apt install unattended-upgrades sudo dpkg-reconfigure unattended-upgrades# 内核防护加固 sudo vim /etc/sysctl.conf# 添加以下参数&#xff1a; net.ipv4.conf.all.rp_filter1 net.ipv4.conf.default.rp_f…...

在前端应用领域驱动设计(DDD):必要性、挑战与实践指南

引言 领域驱动设计&#xff08;Domain-Driven Design&#xff0c;简称 DDD&#xff09;起源于后端复杂业务系统建模领域&#xff0c;是 Eric Evans 在 2003 年提出的一套理论体系。近年来&#xff0c;随着前端工程化与业务复杂度的持续提升&#xff0c;"前端也要 DDD&quo…...

【软件工程】需求分析详解

需求分析是确保软件产品符合用户期望、降低返工风险的关键环节。通过系统化的方法&#xff0c;团队可以从多渠道获取需求&#xff0c;利用多种建模技术对需求进行结构化分析&#xff0c;并编写规范的需求规格说明书&#xff08;SRS&#xff09;&#xff0c;最终通过评审、验证及…...

FPGA-DDS信号发生器

FPGA-DDS信号发生器 DDS基本原理 ​ FPGA实现的DDS&#xff08;直接数字频率合成&#xff09;波形生成器是一种高效、灵活的数字信号生成技术&#xff0c;广泛应用于通信、雷达和测试设备中。其核心原理是通过数字计算生成特定频率的波形。 ​ DDS通过相位累加、查找表(LUT)…...

二进制、高位低位、位移操作与进制转换全解

二进制、高位低位、位移操作与进制转换全解 在计算机科学中&#xff0c;理解高位与低位、左移与右移、进制转换与位运算非常重要。这篇文章用清晰直观的方式梳理这些基本概念。 高位与低位 低位&#xff1a;二进制中靠右的位&#xff0c;权值较小&#xff08;例如 (2^0, 2^1…...

docker存储

注意&#xff1a;数据卷挂载&#xff08;卷映射&#xff09;&#xff1a;Docker会自动创建数据卷&#xff0c;并将容器运行所需的文件复制到数据卷中。 目录挂载&#xff1a;如果宿主机上没有对应的目录&#xff0c;容器会因为缺少运行所需的文件而出错。 1.目录挂载 指令&am…...

回归预测 | Matlab实现DBO-LightGBM蜣螂算法优化轻量级梯度提升机多输入单输出回归预测,作者:机器学习之心

回归预测 | Matlab实现DBO-LightGBM蜣螂算法优化轻量级梯度提升机多输入单输出回归预测&#xff0c;作者&#xff1a;机器学习之心 目录 回归预测 | Matlab实现DBO-LightGBM蜣螂算法优化轻量级梯度提升机多输入单输出回归预测&#xff0c;作者&#xff1a;机器学习之心预测效果…...

[ 问题解决 ] sqlite3.ProgrammingError: SQLite objects created in a thread can ...

目录 为什么会出现这个问题&#xff1f; 解决方法一&#xff1a;每个请求新建自己的连接&#xff08;推荐&#xff09; 解决方法二&#xff1a;允许 SQLite 跨线程使用连接&#xff08;不推荐&#xff09; 小结 当你在 python 中使用 Flask 里面调用了数据库的操作的时候&a…...

AI智能体开发新范式:多智能体协作与自进化系统的构建之道

一、从单Agent到多Agent&#xff1a;为什么“群体智能”是必然&#xff1f; 复杂任务的分而治之案例&#xff1a; 电商大促活动的全自动运营商品Agent&#xff1a;实时调价&#xff08;根据库存/竞品&#xff09;用户Agent&#xff1a;生成千人千面推荐风控Agent&#xff1a;检…...

js补环境工具使用技巧、补环境实例、重点环境检测点详解

什么是补环境&#xff0c;模拟浏览器环境让浏览器js运行&#xff0c;为什么需要补环境&#xff0c;因为浏览器和本地nodejs环境有差异&#xff0c;网站开发者为了检测用户是否是本地环境运行 主要补的环境Document,Window,Navigator,Location,Element 这是内置原始类型&#…...

TF_LOG 配置及级别详解

以下是Terraform中TF_LOG配置及级别的详解&#xff1a; 配置方法 设置日志级别 通过设置TF_LOG环境变量来启用Terraform的日志功能&#xff0c;并指定日志级别。可以将该变量设置为以下值之一&#xff1a;TRACE、DEBUG、INFO、WARN、ERROR。其中&#xff0c;TRACE级别最为详…...

vue3使其另一台服务器上的x.html,实现x.html调用中的函数,并向其传递数据。

vue3例子 <template><div><iframeload"loadIFreamSite"id"loadIframeSite":src"iframeSrc1"frameborder"0"scrolling"no"allowtransparency"true"style"width: 100%"></iframe&g…...