力扣416-分割等和子集(Java详细题解)

news/2024/9/17 3:15:05/ 标签: leetcode, java, 算法

题目链接:416. 分割等和子集 - 力扣(LeetCode)

前情提要:

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

最近刚学完01背包,所以现在的题解都是以01背包问题为基础再来写的。

如果大家不懂01背包的话,建议可以去学一学,01背包问题可以说是背包问题的基础。

如果大家感兴趣,我后期可以出一篇专门讲解01背包问题。

dp五部曲。

1.确定dp数组和i下标的含义。

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

这里下文统一使用一维dp数组。

题目思路:

题目还是比较好入手,判断数组是否可以分为俩个自己,并使俩个子集的元素和相等。

由此可见,如果一个数组他的元素和为偶数的话,就可以使俩个子集的元素和相等。

如果为奇数,就不可能使俩个子集元素和相等,直接return false。

这只是一个小的优化。我们来看看核心思路。

分成俩个子集后,如果我们确定了一个子集的元素和为整个数组和的一半,另一半的就可以确定下来了。

所以我们分析其中的一个子集就可以。

如果一个子集的元素和等于整个数组的元素和的一半,那么这个子集就可以确定下来,整个数组就可以分为俩个子集。

怎么确定个子集的元素和等于整个数组的元素和的一半呢?

这里就要用到01背包的应用了。

01背包是有n个物品,每个物品有其对应的价值和重量,给你一个容量为m的背包,让你求该背包所能放下物品的最大价值。

那么这道题的子集怎么跟01背包关联呢?

其实这个子集的元素和就可以当做01背包的背包容量,元素本身可以当做他的价值和重量,即他的价值和重量都一致。

怎么理解呢?

我们要判断一个集合里是否有数能累加起来等于整个数组元素和的一半。

元素和当做背包容量。

元素本身就是物品。

元素的值就是物品的价值,同时也代表它所占的背包容量。

其实01背包我们是要尽可能的将背包装满然后得出他的最大价值。

那这个子集的元素和就是我们尽可能的将背包装满判断他的最大价值等于容量即可。

接着我们用dp五部曲来系统分析。

1.确定dp数组和i下标的含义。

dp[i] 表示i容量的背包所能放下的最大价值。

如果后面有不理解的,多理解一下dp数组的含义。

2.确定递推公式。

我们每个元素只有选和不选俩种状态。

即选择nums[i]这个元素时,对于背包只有选和不选俩个状态。

我们类比一下01背包问题的递推公式dp[j] = Math.max(dp[j],dp[j - weight[i] + value[i]);

没选的状态就是dp[j]。没有选他那他的重量肯定就不变。

选的状态就是dp[j - weigtht[i]] + value[i]。

既然选择要加nums[i],那我们肯定要求出在放入他之前的最大价值再加上他自身的价值就是背包整个的价值。

放入之前的容量就是j - weigth[i]

因为本题是重量与价值一致。

我们尽可能的将背包填满使它的价值等于它背包的容量。如果等于则return true反之return false

所以当背包容量为j时,dp[j] = Math.max(dp[j],dp[j - nums[i]] + nums[i]);

3.dp初始化。

初始化也很重要,当我们的元素和为0时,那我们所占的元素价值为多少?

肯定为0啊,所以dp[0] = 0。

那其他非零元素和我们怎么初始化呢?

其实非零元素和我们可以不管他们,他们都可以根据当前元素选或不选来推出元素和的价值。

4.确定dp的遍历顺序。

背包问题我们的遍历顺序是先遍历物品再遍历背包,同理,元素和也是先遍历物品(元素)再遍历背包(元素和)。

且第一层循环遍历物品是从前往后遍历,而第二层循环是从后往遍历。

从后往前遍历背包容量是确保每个物品只放一次,即不需要前面的状态。

如果从前往后遍历背包容量可能导致一个物品放入多次,他使用了前面的状态。

而本题元素只能使用一次,所以背包容量应该从后往前遍历。

5.如果没有ac打印dp数组 利于debug。

最后dp[i]模拟后情况就是这样,大家可以打印dp数组对着看看哪与你的不符。

在这里插入图片描述

最终代码:

java">class Solution {public boolean canPartition(int[] nums) {//定义元素和int sum = 0;for(int i = 0;i < nums.length; i++){sum += nums[i];}//判断如果不为偶数 直接返回falseif(sum % 2 != 0)return false;//目标元素和int tagert = sum / 2;//定义dp数组int[] dp = new int [tagert + 1];//初始化dp数组dp[0] = 0;//确定dp数组的遍历顺序for(int i = 0;i < nums.length;i ++){for(int j = tagert;j >= nums[i];j --){dp[j] = Math.max(dp[j],dp[j - nums[i]] + nums[i]);//如果背包价值等于背包容量 直接return trueif(dp[j] == tagert){return true;}}}return false;}
}

背包问题就是这样,思路分析一大堆,实际代码一小堆。

我们多做多理解就好。

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!


http://www.ppmy.cn/news/1522546.html

相关文章

人生苦短我用Python Excel文件基本操作

人生苦短我用Python Excel文件基本操作 前言文件基本操作的模块和类pathlib.Path 类os.stat_result 类time.struct_time 命名元组time 模块shutil 模块 示例查看属性拷贝文件重命名文件查找文件批量操作 测试 前言 本文主要介绍通过Python中的pathlib模块&#xff0c;完成Exce…

【Android面试八股文】你能说说FragmentPagerAdapter 和 FragmentStatePagerAdapter的区别吗?

文章目录 一、FragmentPagerAdapter1.1 工作方式1.2 生命周期1.3 优缺点1.4 适用场景1.5 示例二、FragmentStatePagerAdapter2.1 工作方式2.2 生命周期2.3 优缺点2.4 适用场景2.4 示例三、FragmentPagerAdapter和FragmentStatePagerAdapter关于instantiateItem()方法和destroyI…

【Java中的位运算和逻辑运算详解及其区别】

Java中的位运算和逻辑运算详解及其区别 在 Java 编程中&#xff0c;位运算和逻辑运算是常见的两种操作类型。位运算用于操作整数的二进制位&#xff0c;而逻辑运算则是处理布尔值 (boolean) 的运算。本文将详细讲解这两种运算及其主要区别&#xff0c;并给出相应示例。 应用场…

Docker入门学习-01

Docker 官方文档 1. Docker 基础知识 1.1 什么是 Docker&#xff1f; Docker 是一个开源的平台&#xff0c;用于开发、交付和运行应用程序。它使用容器技术&#xff0c;将应用程序及其依赖打包在一个轻量级的可移植容器中。 1.2 Docker 的主要组件 镜像&#xff08;Image&a…

Django form.save 方法的详细分析

在 Django 中&#xff0c;form.save() 方法是用于将表单中的数据保存到数据库的核心方法。它的功能和实现可以分为几个重要的部分&#xff0c;下面就是我对 form.save() 方法的详细分析&#xff1a; 1、问题背景 在 Django 中&#xff0c;我们经常会使用 Form 来处理用户提交的…

2024 年高教社杯全国大学生数学建模竞赛 C 题 农作物的种植策略(详细思路+matlab代码+python代码+论文范例)

持续更新中,2024年数学建模比赛思路代码论文都会发布到专栏内,只需订阅一次! 完整论文+代码+数据结果链接在文末! 一、第一问 问题描述:假定各种农作物未来的预期销售量、种植成本、亩产量和销售价格相对于 2023 年保持稳定,每季种植的农作物在当季销售。如果某种作物每…

mysql基础知识-锁机制

文章目录 锁类型1. 共享锁&#xff08;Shared Locks, S锁&#xff09;2. 排他锁&#xff08;Exclusive Locks, X锁&#xff09;3. 意向锁&#xff08;Intention Locks&#xff09;4. 记录锁&#xff08;Record Locks&#xff09;5. 间隙锁&#xff08;Gap Locks&#xff09;6. …

SpringBoot和Mybatis框架怎么防止SQL注入

在 Spring Boot 和 MyBatis 中&#xff0c;防止 SQL 注入的主要方法包括&#xff1a; 1.使用 MyBatis 的动态 SQL MyBatis 提供了安全构建 SQL 查询的方式&#xff0c;推荐使用动态 SQL 标签&#xff08;如 <if>、<choose>、<foreach> 等&#xff09;构建查…

安卓玩机工具-----通用安卓玩机工具 “搞机助手”界面预览 推荐

在网络中有很多很好玩的工具。方便安卓机型联机使用各种功能。系列博文将详细的演示有些工具的特点与使用方法 搞机助手 作者&#xff1a;流水断崖 目前开发功能有&#xff1a;Twrp recovery全自动刷机&#xff0c;免Root冻结、卸载预装软件&#xff0c;免Root激活&#xff…

Azure和Transformers的详细解释

Azure AI 是微软提供的人工智能 (AI) 解决方案的集合&#xff0c;旨在帮助开发人员、数据科学家和企业轻松构建和部署智能应用程序。以下是对 Azure AI 各个方面的详细解释&#xff1a; Azure AI 主要组件 Azure Cognitive Services&#xff08;认知服务&#xff09;&#xff…

音频-语言大模型原理

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

【Dash】feffery_antd_componenet 中的 AntdSpace

一、feffery_antd_componenet 中的 AntdSpace feffery_antd_components&#xff08;简称fac&#xff09;中的AntdSpace组件是一个基于Ant Design的Dash第三方组件&#xff0c;它用于在水平或垂直方向上放置多个元素&#xff0c;并提供元素之间的间距。以下是AntdSpace组件的一…

鸿蒙开发中实现自定义弹窗 (CustomDialog)

效果图 #思路 创建带有 CustomDialog 修饰的组件 &#xff0c;并且在组件内部定义controller: CustomDialogController 实例化CustomDialogController&#xff0c;加载组件&#xff0c;open()-> 打开对话框 &#xff0c; close() -> 关闭对话框 #定义弹窗 (CustomDial…

Google Maps API申请和集成到React Native应用中的教程

Google Maps API申请和集成到React Native应用中的教程 访问Google Cloud Console 打开浏览器,访问 https://console.cloud.google.com/使用您的Google账号登录 选择或创建项目 在页面顶部的项目下拉菜单中,选择现有项目或创建新项目如果创建新项目,点击"新建项目",…

本地如何快速启动静态服务器

本地快速启动静态服务器 有许多第三方库可以帮助你快速启动一个静态服务器&#xff0c;甚至无需编写代码。通过命令行运行这些库后&#xff0c;它们会自动启动一个服务器并打开指定端口&#xff0c;展示当前目录下的文件内容&#xff1a; 电脑得提前安装NodeJS 1、http-serv…

yum源404导致Could not resolve host: mirrorlist.centos.org

yum源更换错误问题记录 网上查询到的部分源过旧&#xff0c;现在已经不存在404&#xff0c;可以将报错信息中的无法访问的地址在浏览器中尝试。如下http://mirrorlist.centos.org/?release7&archx86_64&repoos&infrastock这个地址就已经不在。 可以网上搜一下最新…

UI(五)常用布局总结

自适应布局 1.1、线性布局&#xff08;LinearLayout&#xff09; 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列&#xff0c;Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距&#xff0c;达到各子组件…

关于HTTP SESSION

一个浏览器客户端共享一个session&#xff0c;当浏览器请求到服务器时 通过HttpSession session request.getSession(false);来创建session。 HttpSession session request.getSession(false); 当参数为false时&#xff0c;服务器会通过sessionID找&#xff0c;如果当前服务器…

启动与登录Mysql

1.启动与停止MYSQL服务 启动MySQL 服务的命令 以管理员身份打开Windows 的命令行窗口&#xff0c;在命令提示符后输入以下命令启动MySQL 服务&#xff1a; net start[ 服务名称] 也可以直接输入以下命令&#xff1a; net start 按【Enter】键执行该命令&#xff0c;默认启…

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入&#xff08;Embedding&#xff09;方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节&#xff1a;嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以…