一. 题目
二. 思路
所有和sum为奇数,则不可能分割两个元素和相等的子集。
就变成是否存在和为sum/2的选法,即01背包问题。
三. 代码
class Solution
{
static final int N = 2, M = (int) 1e4 + 10;
boolean[][] f = new boolean[N][M];
public boolean canPartition(int[] nums)
{
int sum = Arrays.stream(nums).sum();
int n = nums.length, m = sum / 2;
if (sum % 2 != 0) return false;
for (int i = 0; i < N; ++i) Arrays.fill(f[i], false);
f[0][nums[0]] = true;
for (int i = 1; i < n; ++i)
for (int j = 0; j <= m; ++j)
{
f[i & 1][j] = f[i - 1 & 1][j];
if (j >= nums[i]) f[i & 1][j] |= f[i - 1 & 1][j - nums[i]];
}
return f[n - 1 & 1][m];
}
}