问题在于最小化提供准确找零所需的硬币数量。总会有 1 的硬币可用,因此问题总会有解决方案。
一些样品硬币套及其解决方案的金额为 40 美分:
硬币组 = {1, 5, 10, 20, 25},解决方案 = {0, 0, 0, 2, 0}
硬币集 = {1, 5, 10, 20},解决方案 = {0, 0, 0, 2}
实现返回正确的最小值。硬币的数量,但我无法保存正确的解决方案数组。
int change(int amount, int n, const int* coins, int* solution) {
if(amount > 0) {
int numCoinsMin = numeric_limits<int>::max();
int numCoins;
int imin;
for(int i = 0; i != n; ++i) {
if(amount >= coins[i]) {
numCoins = change(amount - coins[i], n, coins, solution) + 1;
if(numCoins < numCoinsMin) {
numCoinsMin = numCoins;
imin = i;
}
}
}
solution[imin] += 1;
return numCoinsMin;
}
return 0;
}
样品运行:
int main() {
const int n = 4;
int coins[n] = {1, 5, 10, 20, 25};
int solution[n] = {0, 0, 0, 0, 0};
int amount = 40;
int min = change(amount, n, coins, solution);
cout << "Min: " << min << endl;
print(coins, coins+n); // 1, 5, 10, 20
print(solution, solution+n); // 231479, 20857, 4296, 199
return 0;
}