1. Recursive DFS Exhaustion
Intuition
At each step, try subtracting every coin denomination and recurse on the remaining balance.
Algorithm
- Define
dfs(rem). - If
rem == 0, return 0. - If
rem < 0, return infinity. - Initialize
minCoins = infinity. - For each coin
cincoins:minCoins = min(minCoins, 1 + dfs(rem - c)). - Return
minCoins.
#include <iostream>#include <vector>#include <algorithm> using namespace std; int dfs(int rem, const vector<int>& coins) { if (rem == 0) return 0; if (rem < 0) return 1e9; int minCoins = 1e9; for (int c : coins) { int res = dfs(rem - c, coins); if (res != 1e9) { minCoins = min(minCoins, 1 + res); } } return minCoins;} int coinChangeRec(vector<int>& coins, int amount) { int ans = dfs(amount, coins); return ans >= 1e9 ? -1 : ans;} int main() { vector<int> coins = {1, 2, 5}; int amount = 11; cout << "Fewest coins (Recursive): " << coinChangeRec(coins, amount) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(S^n) where S is amount and n is coins.length - Space complexity:
O(S) recursion stack