|
1 | 1 | #include <bits/stdc++.h> |
2 | 2 | using namespace std; |
| 3 | +#define LLI long long int |
3 | 4 |
|
4 | | -bool isSubsetSum(int a[], int n, int sum) { |
| 5 | +const int mx = 1e5+5; |
| 6 | + |
| 7 | +// complexity: exponential |
| 8 | +bool isSubsetSumRec(int a[], int n, int sum) { |
| 9 | + if (sum == 0) return true; |
| 10 | + if (n == 0 && sum != 0) return false; |
| 11 | + if (a[n-1] > sum) return isSubsetSumRec(a, n-1, sum); |
| 12 | + return isSubsetSumRec(a, n-1, sum) || // excluding cur element |
| 13 | + isSubsetSumRec(a, n-1, sum-a[n-1]); // including cur element |
| 14 | +} |
| 15 | + |
| 16 | +// complexity: Pseudo-polynomial |
| 17 | +bool isSubsetSumDP(int a[], int n, int sum) { |
5 | 18 | bool subset[n+1][sum+1]; |
6 | 19 | for (int i = 0; i <= n; i++) subset[i][0] = true; |
7 | | - for (int i = 1; i <= sum; i++) subset[0][i] = false; |
| 20 | + for (int i = 0; i <= sum; i++) subset[0][i] = false; |
8 | 21 | for (int i = 1; i <= n; i++) { |
9 | 22 | for (int j = 1; j <= sum; j++) { |
10 | 23 | if (j < a[i-1]) subset[i][j] = subset[i-1][j]; |
11 | 24 | else subset[i][j] = subset[i-1][j] || subset[i-1][j-a[i-1]]; |
12 | 25 | } |
13 | | - } /* |
14 | | - for (int i = 0; i <= n; i++) { |
15 | | - for (int j = 0; j <= sum; j++) printf("%4d", subset[i][j]); |
16 | | - printf("\n"); |
17 | | - } */ |
| 26 | + } |
18 | 27 | return subset[n][sum]; |
19 | 28 | } |
20 | 29 |
|
21 | 30 | int main() { |
22 | | - int a[] = {3, 34, 4, 12, 5, 2}, sum = 9; |
23 | | - printf("%s\n", (isSubsetSum(a, sizeof(a)/sizeof(a[0]), sum)) ? "Subset Exist" : "Subset doesn't exist"); |
| 31 | + int a[] = {3, 4, 2, 7, 8, 1, 3}; |
| 32 | + int len = sizeof(a) / sizeof(a[0]); |
| 33 | + int sum; cin >> sum; |
| 34 | + cout << (isSubsetSumDP(a, len, sum) ? "Subset Found" : "Subset Not found!") << endl; |
24 | 35 | } |
0 commit comments