1. Recursive Inclusion / Exclusion
Intuition
Recursively branch each element into subset 1 or subset 2, tracking cumulative sums.
Algorithm
- Define
solve(i, currentSum). - If
i == n, returnabs((totalSum - currentSum) - currentSum). - Option 1: Include
nums[i]in S1:solve(i + 1, currentSum + nums[i]). - Option 2: Exclude
nums[i]from S1:solve(i + 1, currentSum). - Return
min(Option 1, Option 2).
#include <iostream>#include <vector>#include <numeric>#include <cmath>#include <algorithm> using namespace std; class Solution { int solve(int i, int currentSum, int totalSum, const vector<int>& nums) { if (i == nums.size()) { return abs((totalSum - currentSum) - currentSum); } int take = solve(i + 1, currentSum + nums[i], totalSum, nums); int notTake = solve(i + 1, currentSum, totalSum, nums); return min(take, notTake); }public: int minDifference(vector<int>& nums) { int totalSum = accumulate(nums.begin(), nums.end(), 0); return solve(0, 0, totalSum, nums); }}; int main() { Solution sol; vector<int> nums = {1, 6, 11, 5}; cout << "Min Diff: " << sol.minDifference(nums) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^n) - Space complexity:
O(n) recursion stack