1. Recursive Inclusion / Exclusion
Intuition
Recursively branch whether each element is included or excluded from the subset.
Algorithm
- Define
solve(idx, rem). - If
rem == 0, returntrue. - If
idx == n || rem < 0, returnfalse. - Return
solve(idx + 1, rem - arr[idx]) || solve(idx + 1, rem).
#include <iostream>#include <vector> using namespace std; class Solution { bool solve(int idx, int rem, const vector<int>& arr) { if (rem == 0) return true; if (idx == arr.size() || rem < 0) return false; return solve(idx + 1, rem - arr[idx], arr) || solve(idx + 1, rem, arr); }public: bool isSubsetSum(vector<int>& arr, int sum) { return solve(0, sum, arr); }}; int main() { Solution sol; vector<int> arr = {3, 34, 4, 12, 5, 2}; cout << (sol.isSubsetSum(arr, 9) ? "true" : "false") << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^n) - Space complexity:
O(n) call stack