-
Notifications
You must be signed in to change notification settings - Fork 1
/
05_EqualSumPartition.cpp
47 lines (45 loc) · 1.58 KB
/
05_EqualSumPartition.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// Question Link :- https://leetcode.com/problems/partition-equal-subset-sum/
// Partition Equal Subset Sum
// T.C = O(sum*n)
// S.C = O(sum)
class Solution {
public:
bool isSubsetPossible(vector<int>& arr, int n, int sum) {
bool t[n + 1][sum + 1]; // DP - matrix
// initialization
for (int i = 0; i<n+1; i++) { // i -> size of array
for (int j = 0; j<sum+1; j++) { // j -> target sum (subset sum)
// when array(i) is empty than there is no meaning of sum of elements so return false
if (i == 0) {
t[i][j] = false;
}
// when sum(j) is zero and there is always a chance of empty subset so return it as true;
if (j == 0) {
t[i][j] = true;
}
}
}
for (int i = 1; i <n+1; i++) {
for (int j = 1; j <sum+1; j++) {
if (arr[i - 1] <= j) {
// after taking and element substract from the (sum) i.e -> in {3,8} 3 is taken then we want 11-3=8in the array
t[i][j] = t[i - 1][j - arr[i - 1]] || t[i - 1][j]; // either take or(||) do not take
} else {// if sum is less than array size just leave and increment
t[i][j] = t[i - 1][j];
}
}
}
return t[n][sum]; // at last return T/F
}
bool canPartition(vector<int>& arr) {
int n = arr.size();
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}
if (sum % 2 != 0) { // if sum is odd --> not possible to make equal partitions
return false;
}
return isSubsetPossible(arr, n, sum / 2);
}
};