問題は、正確な釣り銭を与えるために必要なコインの量を最小限に抑えることにあります。常に 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;
}