コインの両替問題に対するボトムアップのアプローチを構築しています。要求された変更を提供するために必要な最小数のコインを提供する必要があります。指定された金種が値を形成できないため、変更を指定できなかった可能性があります。
たとえば、指定された金種が {4, 8} で、5 の変更を要求した場合、5 を発行することは不可能です。以下のプログラムを作成しましたが、要求された変更を形成することが不可能でない限り、ほとんどの状況でうまく機能します。 . たとえば、金種がちょうど {4} の場合に 5 をリクエストすると、偽の 1 つが返されます。この問題を解決するにはどうすればよいですか?
ここで、P は要求された変更を表し、S はインデックス 0 から S - 1 までの配列 denominations[] に格納されている金種の数です。dp は -1 に初期化された計算用の 2 次元配列です。
for (int i = 0; i <= P; ++i) {
for (int j = 0; j < S; ++j) {
int ans, x, y;
// Min. no. of coins with current coin
x = (i - denominations[j] >= 0) ? dp[i - denominations[j]][j] + 1: 0;
// Min. no. of coins w/o current coin
y = (j > 0) ? dp[i][j - 1] : 0;
ans = min(x, y);
if (ans == 0) ans = max(x, y);
dp[i][j] = ans;
}
}
ご協力ありがとうございました。