Skip to content

Commit b2a97e2

Browse files
Create partition_equal_subset.cpp
1 parent 4d739f1 commit b2a97e2

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

partition_equal_subset.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
class Solution {
2+
public:
3+
4+
/*
5+
best solution
6+
bool cal(vector<int> nums, int sum, int i) {
7+
if (i == nums.size() || sum < nums[i]) return false;
8+
if (sum == nums[i]) return true;
9+
10+
return cal(nums, sum - nums[i], i+1) || cal(nums, sum, i+1);
11+
}
12+
13+
bool canPartition(vector<int>& nums) {
14+
sort(nums.rbegin(), nums.rend());
15+
int sum = 0;
16+
for (auto num : nums) sum += num;
17+
if (sum%2) return false;
18+
sum /= 2;
19+
return cal(nums, sum, 0);
20+
}
21+
*/
22+
23+
bool subsetSumDP(vector<int>& nums, int sum, int n) {
24+
25+
//dp matrix
26+
//first col => true, first row => false
27+
28+
vector<vector<bool>> dp(n + 1, vector<bool>(sum+1));
29+
30+
//sum > 0 but n is 0 is not possible.. first row of dp matrix
31+
for(int i=0; i<=sum; i++) dp[0][i] = false;
32+
33+
//empty sum is subset => {}
34+
for(int i=0; i<=n; i++) dp[i][0] = true;
35+
36+
for(int i=1; i<=n; i++) {
37+
for(int j=1; j<=sum; j++) {
38+
39+
if(nums[i-1] <= j) //current value is less than sum => include or exclude
40+
dp[i][j] = dp[i-1][j - nums[i-1]] || dp[i-1][j];
41+
42+
else
43+
dp[i][j] = dp[i-1][j]; //current value > sum; definitely exclude
44+
}
45+
}
46+
return dp[n][sum];
47+
}
48+
49+
bool canPartition(vector<int>& nums) {
50+
auto sum = 0;
51+
sum = accumulate(nums.begin(), nums.end(), sum);
52+
cout<<sum<<"\n";
53+
if(sum % 2 != 0) return false;
54+
return subsetSumDP(nums, sum/2, nums.size());
55+
56+
}
57+
};

0 commit comments

Comments
 (0)