题目描述:
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意:
- 每个数组中的元素不会超过 100
- 数组的大小不会超过 200
示例 1:
输入: [1, 5, 11, 5]
输出: true
解释: 数组可以分割成 [1, 5, 5] 和 [11].
示例 2:
输入: [1, 2, 3, 5]
输出: false
解释: 数组不能分割成两个元素和相等的子集.
解题思路:
主要是看能不能取其中一部分数组成数组总和的一半,转化为01背包问题(包容量为sum/2)。
AC代码:
class Solution {
public:
bool canPartition(vector<int>& nums)
{
int sum = accumulate(nums.begin(), nums.end(),0);
if (sum&1) return false;
vector<int>dp(sum + 1);
dp[0] = 1;
for (auto num : nums)
{
for (int i = sum >> 1; i >= 0; i--)
{
if (dp[i]) dp[i + num] = 1;
}
if (dp[sum >> 1]) return true;
}
return false;
}
};