Description
Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.
Note
1.Each of the array element will not exceed 100.
2.The array size will not exceed 200.
Example 1
Input: [1, 5, 11, 5]
Output: true
Explanation: The array can be partitioned as [1, 5, 5] and [11].
Example 2
Input: [1, 2, 3, 5]
Output: false
Explanation: The array cannot be partitioned into equal sum subsets.
Solution 1(C++)
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for(int n:nums){
sum += n;
}
if(sum%2 != 0) return false;
else return helper(nums, sum/2);
}
private:
bool helper(vector<int>& nums, int target){
vector<bool> dp(target+1, false);
dp[0] = true;
for(int i=0; i<nums.size(); i++){
for(int j=target; j>=nums[i]; j--){
dp[j] = dp[j] || dp[j-nums[i]];
}
}
return dp[target];
}
后续更新
其他类似的题目可参考:
- LeetCode-494. Target Sum
- LeetCode-279. Perfect Squares
- LeetCode-139. Word Break
- LeetCode-322. Coin Change
算法分析
经过上面两道题的练习,遇到这种题目也不会茫然了,相比较于求组合之和等于目标数的所有组合可能的个数、与求组合之和等于目标数的所需最少元素的个数,这道题只判断能不能存在这样的组合,其实是一样的。就不多赘述了。
程序分析
略。