#include <bits/stdc++.h>
using namespace std;
int minCoins(int coins[], int m, int N) {
if (N == 0)
return 0;
// Initialize result to a large value
int res = INT_MAX;
for (int i = 0; i < m; i++) {
// Check if the coin can be used (coin value <= remaining target)
if (coins[i] <= N) {
// Recursive call for the reduced amount
int sub_res = minCoins(coins, m, N - coins[i]);
// Update the result if a smaller value is found
if (sub_res != INT_MAX) // Ensure no overflow
res = min(res, 1 + sub_res);
}
}
return res;
}
int main() {
struct TestCase {
vector<int> coins; // Coin denominations
int target; // Target amount
};
TestCase testCases[] = {
{{1, 2, 3, 4, 5}, 11},
{{2, 5, 10}, 7},
{{1}, 3},
{{5, 10, 25}, 30},
{{3, 7}, 5}
};
int totalTests = sizeof(testCases) / sizeof(testCases[0]);
for (int i = 0; i < totalTests; i++) {
TestCase tc = testCases[i];
int m = tc.coins.size();
int result = minCoins(tc.coins.data(), m, tc.target);
cout << "Test case " << i + 1 << ":\n";
cout << "\tCoins: [";
for (int j = 0; j < tc.coins.size(); j++) {
cout << tc.coins[j];
if (j != tc.coins.size() - 1)
cout << ", ";
}
cout << "]\n";
cout << "\tTarget: " << tc.target << "\n";
cout << "\tMinimum coins required: " << (result == INT_MAX ? -1 : result) << "\n";
cout << string(100, '-') << "\n";
}
return 0;
}