1. Recursive Exhaustive Search (Include/Exclude)
Intuition
At each index from 0 to n-1, branch into taking the element or skipping it.
Algorithm
- Define
dfs(i, currentSum). - If
i == arr.length: returncurrentSum == target ? 1 : 0. - Option 1: skip
dfs(i + 1, currentSum). - Option 2: take
dfs(i + 1, currentSum + arr[i]). - Return Option 1 + Option 2.
#include <iostream>#include <vector> using namespace std; int dfs(int i, int currentSum, int target, const vector<int>& arr) { if (i == (int)arr.size()) { return currentSum == target ? 1 : 0; } int skip = dfs(i + 1, currentSum, target, arr); int take = dfs(i + 1, currentSum + arr[i], target, arr); return skip + take;} int countSubsetsRec(const vector<int>& arr, int sum) { return dfs(0, 0, sum, arr);} int main() { vector<int> arr = {1, 2, 3, 3}; int sum = 6; cout << "Subsets with sum " << sum << " (Recursive): " << countSubsetsRec(arr, sum) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^n) - Space complexity:
O(n) call stack