1. Include / Exclude Recursion
Intuition
For each coin index, either include the coin and keep the same index (unbounded pick), or skip to the next coin index.
Algorithm
- Define
countWays(idx, rem). - If
rem == 0, return 1 (found a valid combination). - If
rem < 0oridx == coins.length, return 0. - Option 1 (take coin):
countWays(idx, rem - coins[idx]). - Option 2 (skip coin):
countWays(idx + 1, rem). - Return Option 1 + Option 2.
#include <iostream>#include <vector> using namespace std; int countWaysRec(int idx, int rem, const vector<int>& coins) { if (rem == 0) return 1; if (rem < 0 || idx == (int)coins.size()) return 0; int take = countWaysRec(idx, rem - coins[idx], coins); int skip = countWaysRec(idx + 1, rem, coins); return take + skip;} int changeRec(int amount, vector<int>& coins) { return countWaysRec(0, amount, coins);} int main() { vector<int> coins = {1, 2, 5}; int amount = 5; cout << "Combinations (Recursive): " << changeRec(amount, coins) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^(amount / min_coin)) - Space complexity:
O(amount + coins.length) recursion stack