416. Partition Equal Subset Sum (Medium)
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.
Solution: DP 46ms
Subset Sum Problem
Algorithm:
Firstly this algorithm can be viewed as knapsack problem where individual array elements are the weights and half the sum as total weight of the knapsack.
1.take a solution array as boolean array sol[] of size sum/2+1
- For each array element,traverse the array and set sol [j] to be true if sol [j – value of array] is true
3.Let halfsumcloser be the closest reachable number to half the sum and partition are sum-halfsumcloser and halfsumcloser.
4.start from halfsum and decrease halfsumcloser once everytime until you find that sol[halfsumcloser] is true
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for (int n : nums) sum += n;
if (sum % 2) return false;
int target = sum >> 1;
vector<bool> dp(target+1, false);
dp[0] = true;
for (int n : nums) {
for (int i = target; i >= n; --i) {
if (dp[i-n]) dp[i] = true;
}
}
return dp[target];
}
};