动态规划LeetCode-416.分割等和子集
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
示例 1:
输入:nums = [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11] 。
示例 2:
输入:nums = [1,2,3,5] 输出:false 解释:数组不能分割成两个元素和相等的子集。
提示:
1 <= nums.length <= 2001 <= nums[i] <= 100
01背包问题
背包问题,大家都知道,有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
01背包一维滚动数组递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
本题如何转换到01背包问题是关键,我们想一想,题目说分割两个等和子集,那只需要是sum/2得到一个子集的体积,这个sum/2得到的相当于就是一个背包,这个背包体积是sum/2,看nums里面能否把这个背包体积装满,如果能装满,即可以分割等和子集。对应01背包问题,这题注意的点是背包要放入的商品(集合里的元素)重量为元素的数值,价值也为元素的数值,其次背包中每一个元素是不可重复放入。动规五部曲(dp含义、递推公式、初始化、遍历顺序、打印数组)
dp含义:dp[j]表示容量为j的背包,所背的物品价值最大可以为dp[j]。
递推公式:本题中每一个元素的数值既是重量,也是价值。所以
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
初始化:背包容量为j=0,物品最大价值为dp[0]=0这个好理解,那其他下标初始化也为0是为什么呢,因为dp数组在递推的过程中取得最大的价值,把下标初始成负无穷小,就不会被初始值覆盖,这里初始为0即可,也是一样的。
遍历顺序:
这里是用一维滚动数组来解决,所以物品遍历的for循环放在外层,遍历背包的for循环放在内层,然后题目说物品i只能放一次,所以且内层for循环倒序遍历!
因为倒序遍历是为了保证物品i只被放入一次!。但如果一旦正序遍历了,那么物品0就会被重复加入多次!

打印数组:当遇到疑惑或者提交错误时,打印数组出来比较快速的看看哪一步有错。
以下是我在力扣c语言提交的代码,仅供参考:
一维滚动数组:
bool canPartition(int* nums, int numsSize) {//给出容量和数值大小范围,求的还是一半,所以数组大小为200*100/2+1int dp[10001]={0};int sum = 0;int target = 0;for(int i = 0;i<numsSize;i++){sum+= nums[i];}//如果总和为偶数说明可以分割等和子集,反之if(sum % 2 == 0){target = sum / 2;}else if(sum % 2 != 0){return false;}//初始化memset(dp,0,sizeof(dp));dp[0] = 0;//先遍历物品for(int i = 0;i<numsSize;i++){//再遍历背包,且是倒序遍历,保证物品i只被放入一次!for(int j = target;j>=nums[i];j--){//01背包递推公式dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);//本题中每一个元素的数值既是重量,也是价值dp[j] = dp[j] > dp[j-nums[i]] + nums[i] ? dp[j] : dp[j-nums[i]] + nums[i];}}//如果dp[target] == target//说明可以将这个数组分割成两个子集,使得两个子集的元素和相等。if(dp[target] == target) return true;return false;
}
在此也给出二维数组的求解:
bool canPartition(int* nums, int numsSize) {int sum = 0;for(int i = 0;i<numsSize;i++){sum += nums[i];}if(sum % 2 == 1){return false;}int traget = sum / 2;int dp[numsSize+1][traget+1];memset(dp,0,sizeof(dp));for(int i = nums[0];i<=traget;i++){dp[0][i]=nums[0];}for(int i = 1;i<numsSize;i++){for(int j = 0;j<=traget;j++){if(j<nums[i]){dp[i][j] = dp[i-1][j];}else{dp[i][j] = dp[i-1][j] > (dp[i-1][j-nums[i]]+nums[i]) ? dp[i-1][j]: (dp[i-1][j-nums[i]]+nums[i]);}}}if(dp[numsSize-1][traget] == traget){return true;}else{return false;}
}
相关文章:
动态规划LeetCode-416.分割等和子集
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11] 。 示例 2&…...
云原生(五十五) | ECS中自建数据库迁移到RDS
文章目录 ECS中自建数据库迁移到RDS 一、场景说明 二、ECS中自建数据库迁移到RDS实现步骤 三、 创建wordpress数据库 四、登录ECS导出wordpress数据库 五、返回RDS数据库管理控制台 六、开启外网地址并设置白名单 七、获取RDS外网访问地址 八、重新设置wordpress的wp-…...
【吾爱出品】 视频批量分段工具
视频批量分段工具 链接:https://pan.xunlei.com/s/VOJDvtHQE7GOiJ84WNea5Ay1A1?pwd5nta# 选择视频文件 启动程序后,点击 "文件" 菜单下的 "选择视频文件" 按钮,或者直接将视频文件拖放到程序窗口中的视频列表区域。支…...
HTML【详解】input 标签
input 标签主要用于接收用户的输入,随 type 属性值的不同,变换其具体功能。 通用属性 属性属性值功能name字符串定义输入字段的名称,在表单提交时,服务器通过该名称来获取对应的值disabled布尔值禁用输入框,使其无法被…...
二叉搜索树的实现(C++)
前言 二叉搜索树(搜索二叉树,Binary search tree)是一种特殊的二叉树。其规则为:左子树的值一定小于等于根,右子树的值一定大于等于根,并且左右子树也为搜索二叉树。 二叉搜索树的插入 1.若树为空…...
vue2老版本 npm install 安装失败_安装卡主
vue2老版本 npm install 安装失败_安装卡主 特别说明:vue2老版本安装慢、运行慢,建议升级vue3element plus vite 解决方案1: 第一步、修改npm 镜像为国内镜像 使用淘宝镜像: npm config set registry https://registry.npmmir…...
【MySQL】索引篇
1.什么时候适用索引? 字段有唯一限制,比如商品编码经常用于where查询条件的字段经常用于group by和order by 的字段 2.什么时候不需要创建索引? 字段中存在大量重复经常更新的字段表数据太少的时候 where条件、group by,order by里…...
Arduino 第十六章:pir红外人体传感器练习
Arduino 第十六章:PIR 传感器练习 一、引言 在 Arduino 的众多有趣项目中,传感器的应用是非常重要的一部分。今天我们要学习的主角是 PIR(被动红外)传感器。PIR 传感器能够检测人体发出的红外线,常用于安防系统、自动…...
鸿蒙面试题
1.0penHarmony的系统架构是怎样的? 2.电话服务的框架? 3.OpenHarmony与HarmonyOS有啥区别?...
Rust 语言入门(一):打印与格式化输出
对于初学者来说,掌握 Rust 的基本 I/O 操作是入门的第一步。本篇博客将介绍 Rust 语言的打印机制,包括基本的 print!、println! 宏,格式化输出方式,并探讨其底层原理。 Rust 的基本打印 在 Rust 中,最常见的输出方式…...
vue3.x 的 toRef详细解读
在 Vue 3.x 中,toRef 是一个用于创建响应式引用的工具函数。它可以将一个响应式对象的某个属性转换为一个独立的 ref 对象,同时保持与原始属性的响应式连接。以下是 toRef 的详细解读和示例。 1. toRef 的作用 核心功能 toRef 用于从响应式对象&#x…...
wordpress资讯类网站整站打包
wordpress程序,内置了价值499元的模板.但是有了模板没有全自动采集相信大多数人都搞不懂,目录那么多,全靠原创几乎是不可能的事情,除非你是大公司,每人控制一个板块, 这套源码里面最有价值的应该是这个采集…...
GitHub基本操作及Git简单命令
GitHub简介 GitHub就是一个远程仓库,远程仓库可以理解为就是一个可以保存自己代码的地方,在实际开发当中一个项目往往是有多个人来共同协作开发完成的,那么就需要一个统一代码保存的地方,而GitHub就是起到一个共享和汇总代码的作…...
记一次MySQL故障解决
记一次MySQL故障解决 1 故障现象2 故障排查2.1 查看MySQL服务状态2.2 查看服务日志 3 解决方法3.1 增加 wait_timeout 和 interactive_timeout 参数的值,确保连接不会因超时而被关闭:3.2 检查服务已经恢复正常,不过以上只是临时修改ÿ…...
DeepSeek-R1私有化部署教程 | Linux服务器搭建AI大语言模型
**云服务器用LinuxDockerOllamaOpenWebUI部署DeepSeek-R1大语言模型(LLMs),DeepSeek本地化部署教程(在自己电脑上部署也可以参考此教程)。**超详细教程,手把手。 在当今数字化时代,大型语言模型…...
「软件设计模式」桥接模式(Bridge Pattern)
深入解析桥接模式:解耦抽象与实现的艺术 一、模式思想:正交维度的优雅解耦 桥接模式(Bridge Pattern)通过分离抽象(Abstraction)与实现(Implementation),使二者可以独立…...
【Flink快速入门-5.流处理之多流转换算子】
流处理之多流转换算子 实验介绍 前面实验中介绍的算子已经能够满足我们的大部分开发需求了,但是在实际工作中有时候还会遇到一些业务场景,例如需要摄入多个输入流并将其合并处理,或者需要将一条输入流分割为多条子流,在不同的子…...
react传递函数与回调函数原理
为什么 React 允许直接传递函数? 回调函数核心逻辑 例子:父组件控制 Modal 的显示与隐藏 // 父组件 (ParentComponent.tsx) import React, { useState } from react; import { Modal, Button } from antd; import ModalContent from ./ModalContent;co…...
华为云kubernetes基于keda自动伸缩deployment副本(监听redis队列长度)
1 概述 KEDA(Kubernetes-based Event-Driven Autoscaler,网址是https://keda.sh)是在 Kubernetes 中事件驱动的弹性伸缩器,功能非常强大。不仅支持根据基础的CPU和内存指标进行伸缩,还支持根据各种消息队列中的长度、…...
Spring源码分析のBean扫描流程
文章目录 前言一、scanCandidateComponents1.1 isCandidateComponent1.1.1、排除/包含过滤器1.1.2、条件装配1.1.3、重载一1.1.4、重载二1.1.5、补充:Lookup注解 总结 前言 原生的Spring在构造ApplicationContext时,会调用refresh方法。其中就包含了扫描…...
JeecgBoot低代码平台:Java开发者如何用代码生成器提升企业级开发效率
1. 项目概述:一个面向企业级应用的低代码开发平台如果你是一名Java后端开发者,或者是一名中小型企业的技术负责人,那么你一定对“快速开发”这个词有着深刻的体会。业务需求变化快,市场窗口期短,但传统的Java企业级开发…...
ZLUDA兼容性评估指南:在AMD GPU上运行CUDA应用的5大决策要点
ZLUDA兼容性评估指南:在AMD GPU上运行CUDA应用的5大决策要点 【免费下载链接】ZLUDA CUDA on non-NVIDIA GPUs 项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA ZLUDA是一款革命性的开源项目,它实现了在非NVIDIA GPU上运行未修改CUDA应用…...
企业如何落地生成式搜索引擎优化(GEO)?技术实战方案
生成式搜索引擎优化(GEO)不是概念,而是企业必须立即执行的数字营销战略。通过结构化数据增强、内容语义优化和AI模型适配三大核心手段,企业可在ChatGPT、Bing Chat、Google SGE等生成式搜索平台中获得显著曝光提升。 一、GEO与传统SEO的本质区别 传统S…...
单目视频3D追踪技术:Track4World原理与实践
## 1. 项目概述:单目视频3D追踪的破局者在计算机视觉领域,从单目视频中恢复密集的3D运动一直是个经典难题。传统方法要么依赖复杂的多视角几何计算,要么需要预先训练的深度估计网络作为支撑。而Track4World提出了一种令人耳目一新的前馈式解决…...
KL散度近似计算与Dropout扰动优化实践
1. 理解KL散度的本质与应用场景KL散度(Kullback-Leibler Divergence)作为衡量两个概率分布差异的重要工具,在机器学习领域扮演着关键角色。我第一次接触这个概念是在研究变分自编码器(VAE)时,当时对如何量化潜在空间分布与目标分布…...
10个必备PopClip扩展:从文本处理到AI翻译的完整清单
10个必备PopClip扩展:从文本处理到AI翻译的完整清单 【免费下载链接】PopClip-Extensions Source code for extensions in the official PopClip Extensions directory. 项目地址: https://gitcode.com/gh_mirrors/po/PopClip-Extensions PopClip扩展是提升M…...
2026年苹果系统将推“Extensions”功能,AI服务选择不再局限于ChatGPT!
苹果2026年系统更新:引入“Extensions”功能据MacRumors报道,苹果计划在2026年秋季发布的iOS 27、iPadOS 27及macOS 27系统中,引入名为“Extensions”的新功能。该功能允许用户为Apple Intelligence的各项功能自主选择第三方AI服务࿰…...
如何用 cursor.continue 实现本地海量数据的分页查询加载
cursor.continue()实现分页的核心是游标递进定位而非跳过前N条,通过lastKey参数seek到指定键或更大键的下一条记录,配合索引顺序(如倒序)实现高效“下一页”加载,避免循环调用导致性能问题。用 cursor.continue() 实现…...
别再只会用samtools view了:这5个隐藏命令能帮你省下一半分析时间
解锁Samtools高阶技能:5个被低估的高效命令实战指南 如果你已经熟悉samtools view的基础操作,却还在重复执行格式转换和简单统计,那么这篇文章将为你打开新世界的大门。在基因组数据分析领域,效率提升往往隐藏在那些鲜为人知的命令…...
微信小程序云开发对接支付,报错‘缺少total_fee’?别慌,这3个坑我帮你踩过了
微信小程序云开发支付对接实战:破解"total_fee缺失"的深层逻辑 第一次在小程序里接入支付功能时,那种既兴奋又忐忑的心情我至今记得清楚。看着官方文档里简洁的示例代码,本以为半小时就能搞定,结果却在"total_fee&…...
