LeetCode--416. 分割等和子集/494. 目标和【01背包】

embedded/2025/2/12 3:48:12/

416. 分割等和子集

494. 目标和


前言

哈哈,又是背包问题,一开始没写出来,写个题解加深记忆

正文

416. 分割等和子集

给你一个 只包含正整数非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

如题,给定一个数组,求是否能将这个数组划分为和相等的两部分。

乍一看,首先我们需要知道,由于数组中只含整数类型,所以这个数组的Sum不能为奇数,并且当数组长度小于2时,也无法进行分割,所以满足这些条件的直接返回false即可。

接下来,题目要求我们求是否能将数组划分为和相等的两部分,其实就是求数组中是否存在和为Sum/2的子集(不需要连续)。

既然如此,就可以转换成我们的01背包问题,每遍历到一个“物品”,就需要判断选还是不选这个物品加入背包,我们知道,我们只需要判断是否存在的问题,所以只需要根据上一个状态来进行逻辑或计算即可,所以代码如下:

func canPartition(nums []int) bool {sum := 0for i := 0; i < len(nums); i ++ {sum += nums[i]}if sum % 2 == 1 || len(nums) < 2 {return false}V := sum / 2f := make([]bool, V + 1)f[0] = truefor i := 0; i < len(nums); i++ {for j := V; j >= nums[i]; j-- {f[j] = f[j] || f[j-nums[i]]}}return f[V]
}

494. 目标和

给你一个非负整数数组 nums 和一个整数 target

向数组中的每个整数前添加 '+''-' ,然后串联起所有整数,可以构造一个 表达式

  • 例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1"

返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

rt,给定一个数组和目标值target,要求数组中的所有数字都要用到,乍一看下不了手,但是我们可以将数组中每个数加起来得到Sum,然后减去给定的目标值target除以2,就得到了所有符号为’-'的数字的和了,想要知道这里是怎么来的,需要建立一个方程:

符号为正的数 - 符号为负的数 = target

符号为正的数 + 符号为负的数 = sum

联立求解,就是得到了符号相同的数字的和,这里还可以进一步优化,就是给target加上绝对值。

随后就是和上面一样的背包问题,代码如下:

func findTargetSumWays(nums []int, target int) int {sum := 0for i := 0; i < len(nums); i++ {sum += nums[i]}sum -= targetif sum < 0 || sum % 2 == 1 {return 0}V := sum / 2f := make([]int, V + 1)f[0] = 1for i := 0; i < len(nums); i ++ {for j := V; j >= nums[i]; j -- {f[j] += f[j - nums[i]]}}return f[V]
}

结语

菜就多练~


http://www.ppmy.cn/embedded/161506.html

相关文章

Linux TCP 编程详解与实例

一、引言 在网络编程的领域中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;协议因其可靠的数据传输特性而被广泛应用。在 Linux 环境下&#xff0c;使用 C 或 C 进行 TCP 编程可以实现各种强大的网络应用。本文将深入探讨 Linux TCP 编程的各个方面&…

四边形网格处理——沿Edge遍历 矩形域顶点提取

记录最近遇到的一个问题和解决方案。 最近遇到的问题&#xff1a;将一个五边形划分为四边形网格。 参考文献《Closed -form Quadrangulation of n-Sided Patches》&#xff0c;划分方式如下图所示&#xff0c;实际上是在五边形中间添加了一个顶点&#xff0c;顶点分别向五边形的…

使用Redis实现业务信息缓存(缓存详解,缓存更新策略,缓存三大问题)

一、什么是缓存? 缓存是一种高效的数据存储方式,它通过将数据保存在内存中来提供快速的读写访问。这种机制特别适用于需要高速数据访问的应用场景,如网站、应用程序和服务。在处理大量数据和高并发请求时, 缓存能显著提高性能和用户体验。 Redis就是一款常用的缓存中间件。…

工作案例 - python绘制excell表中RSRP列的CDF图

什么是CDF图 CDF&#xff08;Cumulative Distribution Function&#xff09;就是累积分布函数&#xff0c;是概率密度函数的积分。CDF函数是一个在0到1之间的函数&#xff0c;描述了随机变量小于或等于一个特定值的概率。在可视化方面&#xff0c;CDF图表明了一个随机变量X小于…

0073.基于springboot的蜗牛兼职网的设计与实现+论文

一、系统说明 基于springbootvue的蜗牛兼职网的设计与实现,系统功能齐全, 代码简洁易懂&#xff0c;适合小白学编程。 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;蜗牛兼职…

【蓝桥杯嵌入式】2_LED

全部代码网盘自取 链接&#xff1a;https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码&#xff1a;3ii2 1、电路图 74HC573是八位锁存器&#xff0c;当控制端LE脚为高电平时&#xff0c;芯片“导通”&#xff0c;LE为低电平时芯片“截止”即将输出状态“锁存”…

0 CAD开源内核 Truck

Truck是一个基于Rust编写的开源CAD内核&#xff0c;专注于高性能、安全性和模块化设计&#xff0c;适用于寻求高效、可靠CAD解决方案的开发者和企业。开源地址&#xff1a;https://github.com/ricosjp/truck 一、Truck CAD 内核概述 项目背景&#xff1a; Truck是一个创新的C…

springboot 事务管理

在Spring Boot中&#xff0c;事务管理是通过Spring框架的事务管理模块来实现的。Spring提供了声明式事务管理和编程式事务管理两种方式。通常&#xff0c;我们使用声明式事务管理&#xff0c;因为它更简洁且易于维护。 1. 声明式事务管理 声明式事务管理是通过注解来实现的。…