第9章|动态规划

Unit 06 · LeetCode #416 分割等和子集

← Unit 05
仅本次页面有效
416
Partition Equal Subset Sum0/1 Knapsack · Boolean DP

倒序不是背诵规则,
而是在保护“上一层状态”。

本单元把“分成两组相等”改写为“从每个位置至多选择一次,凑出总和的一半”。先用二维表看见旧层与新层,再压缩为一维数组,并亲眼观察正序更新如何让同一元素在一轮中被重复使用。

已恢复上次学习位置阶段、动画、答题、代码槽位和迁移进度均已恢复。
知识桥梁|Unit 05 → Unit 06
Unit 05:完全选择

同一种硬币可以反复使用;金额正序计算不会违反题意。

可重复使用 → 每个位置一次
Unit 06:0/1 选择

每个数组位置只能选或不选一次;压缩后必须防止读取本轮刚写入的状态。

本单元贯穿问题当前来源格属于处理 number 之前的旧层,还是本轮刚由同一个 number 写出的新状态?
LeetCode #416 原题题面转述、示例、约束与提交签名

题目要求

给定整数数组 nums,判断能否将所有元素分成两个子集,使两个子集的元素和相等。每个数组位置必须归入其中一个子集,因此在寻找其中一组时,每个位置最多使用一次。

from typing import List class Solution: def canPartition(self, nums: List[int]) -> bool: pass

约束

  • 1 ≤ nums.length ≤ 200
  • 1 ≤ nums[i] ≤ 100

示例

输入:nums = [1,5,11,5]
输出:true
解释:[1,5,5] 与 [11] 的和均为 11。
输入:nums = [1,2,3,5]
输出:false
解释:总和为 11,无法分成两个整数和相等的子集。

目标复杂度

设总和为 S,目标为 S/2。时间复杂度 O(nS),一维状态空间 O(S)。

状态语义 → 旧层保护
完成当前状态问题后继续
本环节已完成

请停留观察当前状态,确认你能解释当前来源格的层级语义。