Skip to main content

Partition Equal Subset Sum

Problem

Given a non-empty array nums 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.

Solution Approach

Expected Time complexity: O(nsm)O(n*sm)

Click - to see solution code
class Solution {
public:
bool canPartition(vector<int>& nums) {
int n = nums.size();
int sm = 0;
for (int i = 0; i < n; i++) sm += nums[i];
if (sm % 2) return 0;
sm /= 2;

sort(nums.begin(), nums.end());
vector<vector<int>> knap(nums.size() + 1, vector<int>(sm + 1));

for (int i = 1; i <= nums.size(); i++) {
for (int j = 1; j <= sm; j++) {
if (nums[i - 1] > j) {
knap[i][j] = max(knap[i - 1][j], knap[i][j - 1]);
continue;
}
knap[i][j] =
max(knap[i][j], knap[i - 1][j - nums[i - 1]] + nums[i - 1]);
knap[i][j] = max(knap[i][j], knap[i - 1][j]);
knap[i][j] = max(knap[i][j], knap[i][j - 1]);
}
}

return knap[nums.size()][sm] == sm;
}
};