1. Recursive Minimum Coin Search
Intuition
Recursively branch on including each possible denomination to find the minimal coin combination.
Algorithm
- Step 1: Define solve(rem) returning min coins needed.
- Step 2: If rem == 0, return 0. If rem < 0, return infinity.
- Step 3: Loop through all denominations d: ans = min(ans, 1 + solve(rem - d)).
- Step 4: Return ans.
#include <iostream>#include <vector>#include <algorithm> using namespace std; class Solution { int coins[10] = {1, 2, 5, 10, 20, 50, 100, 200, 500, 2000}; int solve(int rem) { if (rem == 0) return 0; if (rem < 0) return 1e9; int ans = 1e9; for (int i = 9; i >= 0; --i) { if (rem >= coins[i]) { ans = min(ans, 1 + solve(rem - coins[i])); break; // Canonical property allows early break } } return ans; }public: vector<int> minPartition(int N) { vector<int> res; for (int i = 9; i >= 0; --i) { while (N >= coins[i]) { N -= coins[i]; res.push_back(coins[i]); } } return res; }}; int main() { Solution sol; int V = 43; vector<int> ans = sol.minPartition(V); cout << "Coins for " << V << ": "; for (int c : ans) cout << c << " "; cout << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^V) - Space complexity:
O(V)