0416:分割等和子集(★)
目录
题目
给你一个 只包含正整数 的 非空 数组 nums
。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
示例 1:
输入:nums = [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11] 。
示例 2:
输入:nums = [1,2,3,5] 输出:false 解释:数组不能分割成两个元素和相等的子集。
提示:
1 <= nums.length <= 200
1 <= nums[i] <= 100
相似问题:
- 0698:划分为k个相等的子集
- 1981:最小化目标值与所选元素的差(2009 分)
- 2025:分割数组的最多方案数(2217 分)
- 2035:将数组分成两个数组并最小化数组和的差(2489 分)
- 2395:和相等的子数组(1249 分)
- 2518:好分区的数目(2414 分)
- 2578:最小和分割(1350 分)
分析
#1
- 令 s 为数组的和,问题相当于找子集满足和等于 s/2
- 这可以看作背包问题,递推即可
|
|
785 ms
#2
- 由于递推时只关心 f 值为 1 的元素,所以可以直接用 set 维护
|
|
534 ms
#2
- 由于 vis 集合的递推只涉及到加法,所以可以用二进制优化
- 用二进制状态 st 表示 vis 集合,集合内所有数加上 x 即是 st « x
解答
|
|
37 ms