一、题目
给定一个 只包含正整数 的 非空 数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意:
每个数组中的元素不会超过 100
数组的大小不会超过 200
示例 1:
输入: [1, 5, 11, 5]
输出: true
解释: 数组可以分割成 [1, 5, 5] 和 [11].
示例 2:
输入: [1, 2, 3, 5]
输出: false
解释: 数组不能分割成两个元素和相等的子集.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-equal-subset-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 动态规划
(1)思路
数组可分割为两个元素和相等的子集,等价于数组中存在一些元素,其和为数组元素总和的一半。因此,本题可转换为背包问题,用动态规划方法进行求解。
(2)代码
class Solution {
public boolean canPartition(int[] nums) {
if (nums.length == 0)
return false;
int sum = 0;
for (int i = 0; i < nums.length; i++)
sum += nums[i];
if ((sum & 1) == 1)
return false;
sum >>= 1;
boolean[] hasSum = new boolean[sum + 1];
hasSum[0] = true;
for (int i = 1; i < sum + 1; i++)
hasSum[i] = false;
for (int i = 0; i < nums.length; i++) {
for (int j = sum; j >= 0; j--) {
if (j + nums[i] < sum + 1 && hasSum[j] == true) {
if (j + nums[i] == sum)
return true;
hasSum[j + nums[i]] = true;
}
}
}
return hasSum[sum];
}
}
(3)结果
执行用时 :11 ms, 在所有 Java 提交中击败了 91.54% 的用户;
内存消耗 :38 MB, 在所有 Java 提交中击败了 78.48% 的用户。
三、其他
暂无。