시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초128 MB1650610989894067.594%

문제

우리나라 화폐단위, 특히 동전에는 1원, 5원, 10원, 50원, 100원, 500원이 있다. 이 동전들로는 정수의 금액을 만들 수 있으며 그 방법도 여러 가지가 있을 수 있다. 예를 들어, 30원을 만들기 위해서는 1원짜리 30개 또는 10원짜리 2개와 5원짜리 2개 등의 방법이 가능하다.

동전의 종류가 주어질 때에 주어진 금액을 만드는 모든 방법을 세는 프로그램을 작성하시오.

입력

입력의 첫 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 10)가 주어진다. 각 테스트 케이스의 첫 번째 줄에는 동전의 가지 수 N(1 ≤ N ≤ 20)이 주어지고 두 번째 줄에는 N가지 동전의 각 금액이 오름차순으로 정렬되어 주어진다. 각 금액은 정수로서 1원부터 10000원까지 있을 수 있으며 공백으로 구분된다. 세 번째 줄에는 주어진 N가지 동전으로 만들어야 할 금액 M(1 ≤ M ≤ 10000)이 주어진다.

편의를 위해 방법의 수는 231 12^{31} - 1 보다 작고, 같은 동전이 여러 번 주어지는 경우는 없다.

풀이

동전의 가치가 c1,c2,...,ci,...,cnc_{1}, c_{2} ,..., c_{i} ,... ,c_{n} n개 있을 때 i번째까지 동전을 사용해서 k를 만드는 경우의 수를 DP(i,k)DP(i, k) 라고 한다. 이때 점화식은

DP(i,k)={DP(i1,k)+DP(i,kcn),  if  (kcn0)DP(i1,k)elseDP(i, k) = \begin{cases} DP(i - 1, k) + DP(i, k - c_{n}) \quad, \; if \; (k-c_{n} \ge 0) \\ DP(i - 1, k) \quad else \end{cases}

이 된다. 예를 들어 1, 2, 5원 동전이 있을때 2원까지 사용하여 6원 동전을 만들때 점화식은 DP(2,6)=DP(1,6)+DP(2,62)DP(2, 6) = DP(1, 6) + DP(2, 6 - 2)가 된다. 식을 풀이하면 1원 “만”을 사용해서 6을 만드는 경우의 수와 적어도 2원 동전을 적어도 “한번 이상” 사용하여 6을 만드는 경우의 수를 합치면 된다. 이때 2원을 한번 사용하면 6원에서 2원을 뺀 4원이 되고 1, 2원을 사용하여 4원을 만드는 경우의 수를 더하면 된다.

아래 표는 0부터 각 동전을 사용해서 만드는 경우의 수를 내려가면서 구한 것이다.

012345678910
010000000000
510000100001
5, 111111222223
5, 1, 2112234567810

이때 동전의 가치는 정렬되지 않아도 상관 없다. 0원으로 0원을 만드는 방법은 무조건 1가지고 나머지는 무조건 0가지이다. 이때 동전의 가치로 만들 수 없으면 0이다.