给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意:
每个数组中的元素不会超过 100
数组的大小不会超过 200
示例 1:
输入: [1, 5, 11, 5]
输出: true
解释: 数组可以分割成 [1, 5, 5] 和 [11].
示例 2:
输入: [1, 2, 3, 5]
输出: false
解释: 数组不能分割成两个元素和相等的子集.
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for(auto num:nums){
sum += num;
}
if(sum % 2 != 0){
return false;
}
int tar = sum / 2;
vector<int>dp(tar+1,INT_MIN);
dp[0] = 0;
for(int i = 0;i<nums.size();i++){
int n = nums[i];
for(int j=tar;j>=n;j--){
dp[j]=max(dp[j],dp[j-n]+n);
if(dp[j]<0){
dp[j] = INT_MIN;
}
}
}
return dp.back()==tar;
}
};