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

动态规划题解——分割等和子集【LeetCode】

416. 分割等和子集

一、算法逻辑(每一步思路)

❓ 问题描述:

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


✅ 思路解析(DFS + 记忆化)

1. 总和判断:
s = sum(nums)
  • 只有当总和是 偶数 时,才可能被分成两个相等的子集;
  • 否则直接返回 False
2. 定义目标:

我们目标是找到一个子集,使得其和为 target = s // 2


3. 定义状态:
dfs(i, j) 表示:是否可以从 nums[0..i] 中选出一些数,使得它们的和为 j
4. 状态转移逻辑:
  • 我们每个数都可以选或不选:
dfs(i, j) = dfs(i-1, j-nums[i])  # 选 nums[i]or dfs(i-1, j)          # 不选 nums[i]

前提是:

  • 当选 nums[i] 时,必须保证 j >= nums[i] 否则非法。
5. 边界条件:
  • i < 0 表示没有数可以选了,此时只有当 j == 0,才能说“成功凑出目标和”。

6. 初始调用:
dfs(len(nums)-1, s//2)
  • 从所有数中尝试凑出 s//2
7. 使用 @cache 实现记忆化,避免指数级重复递归。

二、算法核心点

✅ 核心思想:子集和问题 + 记忆化搜索

  • 本质是 0/1 背包问题:能不能从 nums 中挑若干个数,使它们的和为 target = s // 2
  • DFS 方式天然适合尝试所有选法;
  • 用记忆化优化重复状态访问,转为多项式级别复杂度。
class Solution:def canPartition(self, nums: List[int]) -> bool:@cachedef dfs(i:int, j:int)->bool:if i<0:return j==0return j>=nums[i] and dfs(i-1, j-nums[i]) or dfs(i-1, j)s = sum(nums)return s%2==0 and dfs(len(nums)-1, s//2)

三、复杂度分析

  • 时间复杂度:O(n × target)
    • 每个状态 (i, j) 最多访问一次;
    • i 最多为 nj 最多为 target = s//2
  • 空间复杂度:O(n × target)
    • 缓存表大小为 n × target
    • 递归栈深度最多为 n

总结表

维度

内容

✅ 思路逻辑

转化为是否可以从数组中选出若干数,使它们的和为总和的一半

✅ 核心技巧

记忆化搜索 + 状态定义 dfs(i, j)

✅ 时间复杂度

O(n × s//2),即 O(n × sum/2)

✅ 空间复杂度

O(n × sum/2),包括递归栈和缓存


✅ 示例演示

输入:

nums = [1, 5, 11, 5]

总和为 22,可以划分为 [11] 和 [1,5,5],输出为 True

http://www.dtcms.com/a/282389.html

相关文章:

  • 面向向量检索的教育QA建模:九段日本文化研究所日本语学院的Prompt策略分析(6 / 500)
  • 知识点3:python-sdk 核心概念(prompt、image、context)
  • 有哪些好用的原型设计软件?墨刀、Axure等测评对比
  • MAC 苹果版Adobe Photoshop 2019下载及保姆级安装教程!!
  • Prompt Engineering 快速入门+实战案例
  • C#.NET BackgroundService 详解
  • 增程式汽车底盘设计cad【9张】三维图+设计说明书
  • 机器学习sklearn入门:归一化和标准化
  • 深入解析 AWS RDS Proxy
  • VirtualBox 中 CentOS 7 双网卡配置静态 IP
  • 用 Ray 跨节点调用 GPU 部署 DeepSeek 大模型,实现分布式高效推理
  • 「计算机网络」笔记(一)
  • qt 中英文翻译 如何配置和使用
  • 面试150 二叉树的锯齿层次遍历
  • YOLO13正式发布!考虑将yolov13的创新点融合到半监督中,构建YOLOv13_ssod
  • Qt 将触摸事件转换为鼠标事件(Qt4和Qt5及以上版本)
  • Qt 的信号槽机制中,使用 `connect` 函数时,第五个参数是 **连接类型(Connection Type)**,
  • Ubuntu中man手册不全解决以及man手册中英文切换方法
  • 若依框架下前后端分离项目交互流程详解
  • 20、鸿蒙Harmony Next开发:组件导航(Navigation)和页面路由(@ohos.router)
  • 现代人工智能综合分类:大模型时代的架构、模态与生态系统
  • Node.js ORM框架Sequelize 一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many)
  • NDVI、噪声和细微差别:使用卫星时间序列进行土地覆盖分类
  • K近邻算法的分类与回归应用场景
  • LVS集群调度器
  • 2022年CIE SCI2区TOP,NSGA-II+直升机-无人机搜救任务分配,深度解析+性能实测
  • MongoDB查询的精准匹配和$in的查询区别
  • fastadmin会员单点登录
  • Python进程与协程:高效编程的核心秘密
  • Apache SeaTunnel详解与部署(最新版本2.3.11)