主なアイデアは、 - 各コインjについて、値[J] < = I(すなわち和)我々はi値[j]が見つかりコインの最小数を見て、和(Mましょう) (以前に発見された)。 m + 1が現在の合計iですでに見つかったコインの最小数よりも少ない場合、アレイ内のコインの数を更新します。 EXについて
- 後和= 11、N = 3と値[] = {1,3,5}
は、我々はI = 3和を観察できるように、我々は
i- 1 mins[i] - 1
i- 2 mins[i] - 2
i- 3 mins[i] - 3
i- 3 mins[i] - 1
i- 4 mins[i] - 2
i- 5 mins[i] - 3
i- 5 mins[i] - 1
i- 6 mins[i] - 2
i- 7 mins[i] - 3
i- 8 mins[i] - 4
i- 8 mins[i] - 2
i- 9 mins[i] - 3
i- 10 mins[i] - 4
i- 10 mins[i] - 2
i- 11 mins[i] - 3
を取得し出力します5、8、10、我々は次の方法で私たちの前の最小値からすると改善 -
sum = 3, 3 (1+1+1) coins of 1 to one 3 value coin
sum = 5, 3 (3+1+1) coins to one 5 value coin
sum = 8, 4 (5+1+1+1) coins to 2 (5+3) coins
sum = 10, 4 (5+3+1+1) coins to 2 (5+5) coins.
だから、合計= 11のために、我々は3(5 + 5 + 1)として答えを得るでしょう。
ここではCのコードがあります。トップコードページにある擬似コードと似ていますが、これは上記の答えの1つで提供されています。
int findDPMinCoins(int value[], int num, int sum)
{
int mins[sum+1];
int i,j;
for(i=1;i<=sum;i++)
mins[i] = INT_MAX;
mins[0] = 0;
for(i=1;i<=sum;i++)
{
for(j=0;j<num;j++)
{
if(value[j]<=i && ((mins[i-value[j]]+1) < mins[i]))
{
mins[i] = mins[i-value[j]] + 1;
printf("i- %d mins[i] - %d\n",i,mins[i]);
}
}
}
return mins[sum];
}
ここでは最小の硬貨の記事がある可能性があります。技術は紛らわしい-総称[「ダイナミックプログラミング」](HTTPで知られているhttp://techieme.in/minimum-number-of-coins/ – dharam