leetcode-416. 分割等和子集

题目描述

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

示例 1:

输入:nums = 1,5,11,5

输出:true

解释:数组可以分割成 1, 5, 5 和 11 。

示例 2:

输入:nums = 1,2,3,5

输出:false

解释:数组不能分割成两个元素和相等的子集。

思路

01背包问题,参考:代码随想录

1)先判断数组nums总和是不是偶数,如果是奇数,则直接返回false。因为:数组中的元素都是正整数,如果是奇数的话,除以2,是两个小数的和了。不满足题意

2)题目中找到子集的和是sum(nums)//2,即为存在等和自己的。因为target//2,已经找到一半的子集了,另一半就不用找了

3)初始化:如果题目给的价值都是正整数那么非0下标都初始化为0就可以了,如果题目给的价值有负数,那么非0下标就要初始化为负无穷。

4)dp数组遍历顺序,如果使用一维dp数组,外层循环遍历物品,内层循环遍历背包,且需从大到小遍历背包,已防重复。【不可以先遍历背包再遍历物品】

python 复制代码
class Solution(object):
    def canPartition(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        if sum(nums)%2 != 0:
            return False
        target = sum(nums)//2
        dp = [0] * (target+1)
        for num in nums:
            for j in range(target,num-1,-1):
                dp[j] = max(dp[j],dp[j-num]+num)
        return dp[-1] == target


if __name__ == '__main__':
    s = Solution()
    nums = [1, 5, 11, 5]
    print(s.canPartition(nums))
相关推荐
垆边人似月.26 分钟前
华为OD算法题:查找众数及中位数
数据结构·算法·leetcode
hetao173383733 分钟前
2026-10-08 hetao1733837 的刷题记录
c++·算法
CoderYanger1 小时前
一轮复习——F.动态规划模型总结(入门篇)
java·开发语言·数据结构·算法·leetcode·职场和发展·动态规划
浅念-2 小时前
动态规划专题:斐波那契数列模型 + 网格路径DP(LeetCode例题全解析)
笔记·算法·leetcode·面试·职场和发展·动态规划·推荐算法
一只旭宝2 小时前
数据结构与算法复习手册:从写过,到讲清楚
开发语言·数据结构·c++·算法
夏幻灵2 小时前
每日一题:LeetCode 20:有效的括号——栈与哈希映射详解
算法·leetcode·哈希算法
hetao17338373 小时前
2026-10-07 hetao1733837 的刷题记录
c++·算法
Nil2083 小时前
leetcode 279完全平方数
算法·leetcode·职场和发展
longlongzihan3 小时前
前缀积与后缀积 —— LeetCode 238. 除了自身以外数组的乘积
开发语言·c++·leetcode
All for pursuit.3 小时前
【动态规划-1】121.买卖股票的最佳时机
数据结构·c++·算法·leetcode·动态规划