1. Recursive Inclusion / Exclusion
Intuition
Recursively decide whether to include or exclude each element to reach target = totalSum / 2.
Algorithm
- If
totalSum % 2 != 0, returnfalse. - Define
solve(idx, target). - If
target == 0, returntrue. - If
idx == n || target < 0, returnfalse. - Return
solve(idx + 1, target - nums[idx]) || solve(idx + 1, target).
#include <iostream>#include <vector>#include <numeric> using namespace std; class Solution { bool solve(int idx, int target, const vector<int>& nums) { if (target == 0) return true; if (idx == nums.size() || target < 0) return false; return solve(idx + 1, target - nums[idx], nums) || solve(idx + 1, target, nums); }public: bool canPartition(vector<int>& nums) { int totalSum = accumulate(nums.begin(), nums.end(), 0); if (totalSum % 2 != 0) return false; return solve(0, totalSum / 2, nums); }}; int main() { Solution sol; vector<int> nums = {1, 5, 11, 5}; cout << (sol.canPartition(nums) ? "true" : "false") << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^n) - Space complexity:
O(n) call stack