#include <stdio.h>
#include <limits.h>
int min(int a, int b) {
return (a < b) ? a : b;
}
// Recursive solution
int minCoinsRec(int coins[], int n, int amount) {
if (amount == 0) return 0;
int res = INT_MAX;
for (int i = 0; i < n; i++) {
if (coins[i] <= amount) {
int sub_res = minCoinsRec(coins, n, amount - coins[i]);
if (sub_res != INT_MAX && sub_res + 1 < res)
res = sub_res + 1;
}
}
return res;
}
// Greedy solution
int minCoinsGreedy(int coins[], int n, int amount) {
int count = 0;
int remaining = amount;
while (remaining > 0) {
int coin = -1;
for (int i = 0; i < n; i++) {
if (coins[i] <= remaining && (coin == -1 || coins[i] > coins[coin]))
coin = i;
}
if (coin == -1) return -1; // no coin fits
remaining -= coins[coin];
count++;
}
return count;
}
// DP solution
int minCoinsDP(int coins[], int n, int amount) {
int dp[amount + 1];
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
dp[i] = INT_MAX;
for (int j = 0; j < n; j++) {
if (coins[j] <= i && dp[i - coins[j]] != INT_MAX) {
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[amount];
}
int main() {
int coins[] = {1, 3, 4};
int n = sizeof(coins) / sizeof(coins[0]);
int amount = 6;
int resRec = minCoinsRec(coins, n, amount);
int resGreedy = minCoinsGreedy(coins, n, amount);
int resDP = minCoinsDP(coins, n, amount);
printf("Recursion: Minimum coins needed = %d\n", resRec);
printf("Greedy: Minimum coins needed = %d\n", resGreedy);
printf("DP: Minimum coins needed = %d\n", resDP);
return 0;
}
for (int i = 0; i < n; i++) { if (coins[i] <= amount) { int sub_res = minCoinsRec(coins, n, amount - coins[i]); if (sub_res != INT_MAX && sub_res + 1 < res) res = sub_res + 1; } }
try all coin choices recursively to find minimum coins
while (remaining > 0) { int coin = -1; for (int i = 0; i < n; i++) { if (coins[i] <= remaining && (coin == -1 || coins[i] > coins[coin])) coin = i; } if (coin == -1) return -1; remaining -= coins[coin]; count++; }
pick largest coin possible repeatedly until amount is zero
for (int i = 1; i <= amount; i++) { dp[i] = INT_MAX; for (int j = 0; j < n; j++) { if (coins[j] <= i && dp[i - coins[j]] != INT_MAX) { dp[i] = min(dp[i], dp[i - coins[j]] + 1); } } }
build dp table bottom-up storing minimum coins for each amount
Recursion: Minimum coins needed = 2
Greedy: Minimum coins needed = 3
DP: Minimum coins needed = 2