n가지 종류의 동전이 있다. 이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그러면서 동전의 개수가 최소가 되도록 하려고 한다. 각각의 동전은 몇 개라도 사용할 수 있다.
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어질 수도 있다.
첫째 줄에 사용한 동전의 최소 개수를 출력한다. 불가능한 경우에는 -1을 출력한다.
3 15
1
5
12
3
지난 번에 해결했던, '동전 1'과 비슷한 문제다.
조금 다른 점은, 사용하는 동전 개수가 최소인 개수를 구하는 것이고, 가치가 같은 동전이 여러 번 주어질 수도 있다는 점 이었다.
원리는 다른 dp 문제와 비슷하다.
동전이 2와 3이 주어졌다고 가정하면, 4를 만들 때, 즉 dp[4]를 찾을 때 dp[4-2]와 dp[4-3] 중 최소값에 다가 1을 더하면 된다. 동전의 개수는 그렇게 해봐야 하나씩만 추가되기 때문이다.
coin 안에 있는 값들이 dp[i]와 일치하는 경우는 dp[i] = 1로 지정한다. (coin이 3,4,5가 있으면 dp[3]은 3 하나로 1이 되기 때문이다.)
코드는 다음과 같다.
import sys
n, k = map(int, sys.stdin.readline().split())
coin = []
for _ in range(n) :
c = int(input())
coin.append(c)
dp = [0] * (k+1)
for i in range(1, k+1) :
for j in coin :
if i == j :
dp[i] = 1
for i in range(1, k+1) :
if dp[i] != 1 :
check=[]
for j in coin :
if i-j<0 :
pass
else :
if dp[i-j] != 0 :
check.append(dp[i-j])
if len(check) != 0 :
m = min(check)
dp[i] = m+1
if dp[k] == 0 :
print(-1)
else :
print(dp[k])