주어진 문제를 여러 개의 부분 문제로 분할
- 문제의 크기가 작은 부분 문제에 대한 해를 저장해 놓고,
이를 이용하여 크기가 보다 큰 문제의 해를 상향식으로 만들어가는 설계 기법.
거스름돈 T원, k개의 동전 -> 최적해
- C[i]원 동전 하나 제거
- 거스름돈: T-C[i]원, k-1개의 동전 -> 부분 문제의 최적해
- T원을 만들기 위한 최소 동전의 개수
- , 음수 X에 대하여
i | |
---|---|
0 | 0 |
1 | 1 |
2 | 2 |
3 | 1 |
4 | 1 |
5 | 2 |
6 | x |
=
=
- 거스름돈 6원을 주기 위해서는 최소 2개의 동전이 필요하다는 의미.
int Find_Coin_Number(C[], n, T) {
for(i=1; i < =t, i++){
A[i] = 무한대;
for(j=1; j <= n; j++) {
if (i >= C[j]) {
if (A[i] > A[i - C[j]] + 1) {
A[i] = A[i-C[j]] + 1;
}
}
}
}
return A[T];
}
A[1...T]를 이용하여 T원을 만드는 최적해 X[1...n] (각 동전의 개수)
- and
- 각 동전 C[i]에 대하여 A[T-C[i]] + 1이 A[T]이면, C[i]를 포함하는 최적해가 존재
int Find_Optimal_Coin(C[], n, T) {
R = T; # T원 중 남은 거스름돈
for (i=1; i <= n; i++) {
while(R >= C[i] && A[R] == A[R-C[i]] + 1) {
X[i]++;
R = R - C[i];
}
}
return X[1...n];
}