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:
- Each of the array element will not exceed 100.
- 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.
int subsetSum(int* nums, int numsSize, int s) { int* dp = (int*)malloc((s + 1) * sizeof(int)); for (int i = 0; i <= s; ++i) { dp[i] = 0; } dp[0] = 1; for (int n = 0; n < numsSize; ++n) { for (int i = s; i >= nums[n]; --i) { dp[i] += dp[i - nums[n]]; } if (dp[s] > 0) { return dp[s]; } } return dp[s]; } bool canPartition(int* nums, int numsSize) { int sum = 0; for (int i = 0; i < numsSize; ++i) { sum += nums[i]; } if (sum % 2) { return false; } return subsetSum(nums, numsSize, sum / 2); }