주요 아이디어는 - 각 동전 J를 들어, 값 [J] < = I (즉, 합) 우리는 I-값 [J]에 대한 발견 동전의 최소 수를 보면이 합 (m 가정 해 봅시다) (이전에 발견됨). m + 1이 현재 합계 i에 대해 이미 발견 된 최소 동전 수보다 작 으면 배열의 동전 수를 업데이트합니다. 예를 들어
- 후 합계 = 11, N = 3 값 [] = {1,3,5}
우리가
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
우리 합 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 코드가 있습니다. topcoder 페이지에있는 pseudocode와 유사합니다. 위의 답변 중 하나에서 참조가 제공됩니다.
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