LeetCode 416:分割等和子集 —— (0-1背包)

LeetCode 416:分割等和子集 ------ (0-1背包)

🔗 题目链接

👉 https://leetcode.cn/problems/partition-equal-subset-sum/


📖 内容概要

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

✅ 使用 0/1 背包思想

✅ 一维 DP 优化

✅ 时间复杂度 O(n × sum)

✅ 空间复杂度 O(sum)


💡 解题思路

一、问题转化(最关键一步)

能否从数组中选出若干个数,使其和等于 sum / 2

如果能,那么剩下的数之和也一定是 sum / 2。


二、可行性剪枝

  • 如果数组总和是奇数:

    java 复制代码
    if (sum % 2 == 1) return false;
  • 不可能平分


三、0/1 背包建模

概念 对应
物品 数组中的每个数
重量 数值大小nums[i]
价值 数值大小 nums[i]
背包容量 target = sum / 2

✅ 判断是否能恰好装满容量为 target 的背包


四、DP 定义

java 复制代码
dp[j] = 容量为 j 的背包,能装的最大价值

目标:

java 复制代码
dp[target] == target

五、状态转移方程

java 复制代码
dp[j] = max(
    dp[j],                     // 不选当前数
    dp[j - nums[i]] + nums[i]  // 选当前数
)

六、遍历顺序(非常重要)

java 复制代码
for (int i = 0; i < n; i++) {
    for (int j = target; j >= nums[i]; j--) {
        dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
    }
}

✅ j 必须从大到小

  • 防止同一物品被重复使用
  • 保证是 0/1 背包

✅ AC 代码(Java)

java 复制代码
class Solution {
    public boolean canPartition(int[] nums) {
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }

        // 奇数不可能平分
        if (sum % 2 == 1) return false;

        int target = sum / 2;
        int[] dp = new int[20001]; // dp[j]: 容量为 j 的最大价值和

        // 0/1 背包
        for (int i = 0; i < nums.length; i++) {
            for (int j = target; j >= nums[i]; j--) {
                dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
            }
        }

        return dp[target] == target;
    }
}

⏱️ 复杂度分析

指标 复杂度
时间复杂度 O(n × sum)
空间复杂度 O(sum)

⚠️ 时间复杂度不是 O(n²),而是由数值总和决定


✅ 核心总结一句话

把"能否平分数组"转化为"是否存在子集和为 sum/2",再用 0/1 背包判断是否恰好装满。

相关推荐
lengxuenong4 分钟前
树状数组 · 信息学学习手册1-求和3个模板
c++·学习·算法·青少年编程
yliucherish6 分钟前
Log4Shell 复现实录:我读 OpenJDK 源码,发现两道防线的默认值竟然相反
java
ComputerInBook13 分钟前
泛函分析概观
人工智能·算法·机器学习·泛函分析
维拉德15 分钟前
Java新人第一次接打标需求:从抓包找接口到客户端展示
java
luobobo89623 分钟前
支付回调验签连续失败三天,最后发现是网关的时间戳单位问题
java
BBmmo24 分钟前
Java InputStream.read() 为什么返回 int?
java
Nuanyt39 分钟前
LeetCode Hot100 刷题笔记 · 普通数组专题
java·笔记·算法·leetcode
q275513004240 分钟前
AS8132 DP转HDMI 4K60(420)被动式 国产性价比AS方案
linux·算法·硬件架构·dash
安全指北针1 小时前
密态计算:数据 “可用不可见” 的底层技术解析
人工智能·算法
Jmyd01231 小时前
3D 扫描仪选型技术拆解:精度、点云与软件链路
人工智能·算法·3d·三维数字化