この問題では、特定のコストでコインの交換回数を数える必要があります。
たとえば、コインの価値がである場合50, 20, 10, 5, 1
、次のコストを形成できます。
5 =>(5)、(11111)、これは2つの方法です。
10 =>(10)、(5、5)、(5、11111)、(11111、11111)、これらは4つの方法です。
これが私の機能です。10のコストから物乞いする間違った結果を返しています(実際のウェイ数はわずか4であるのに対し、9ウェイを返します)
int dp[10000];
int coins[] = { 50, 20, 10, 5, 1 };
int rec(int n)
{
if (n == 0) return 1;
if (dp[n] != -1) return dp[n];
int cnt = 0;
for (int i = 0; i < 5; i++)
if (coins[i] <= n) cnt += rec(n - coins[i]);
return dp[n] = cnt;
}
この関数を修正して、正しい数の方法を提供するにはどうすればよいですか?このアルゴリズムは正しいですか?ここで完全なコードとその出力を参照してください
注:私の問題はdp
配列の初期化ではありません。を呼び出す前に毎回memset
初期化するために使用しています。-1
rec