给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意:
- 每个数组中的元素不会超过 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(int num:nums){
sum += num;
}
if(sum % 2 == 1)
return false;
return subsets(nums, sum / 2);
}
bool subsets(vector<int>& nums, int target){
vector<vector<bool>> dp(nums.size() + 1, vector<bool>(target + 1, false));
for(int i = 0; i<nums.size(); i++){
dp[i][0] = true;
}
for(int i = 1; i<=nums.size(); i++){
for(int j = 1;j<=target;j++){
// if(dp[i-1][j]== true){
// dp[i][j] = true;
// }else if(j - nums[i - 1] >= 0 && dp[i-1][j - nums[i - 1]]== true){
// dp[i][j] = true;
// }else{
// dp[i][j] = false;;
// }
if(j - nums[i - 1] < 0){
dp[i][j] = dp[i-1][j];
}else{
dp[i][j] = dp[i-1][j] | dp[i-1][j - nums[i - 1]];
}
}
}
return dp[nums.size()][target];
}
};
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for(int num:nums){
sum += num;
}
if(sum % 2 == 1)
return false;
return subsets(nums, sum / 2);
}
bool subsets(vector<int>& nums, int target){
vector<bool> dp(target + 1, false);
for(int i = 0; i<nums.size(); i++){
dp[0] = true;
}
for(int i = 1; i<=nums.size(); i++){
for(int j = target;j>=0;j--){
if(j - nums[i - 1] < 0){
dp[j] = dp[j];
}else{
dp[j] = dp[j] | dp[j - nums[i - 1]];
}
}
}
return dp[target];
}
};