n가지 종류의 동전이 있다. 이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그러면서 동전의 개수가 최소가 되도록 하려고 한다. 각각의 동전은 몇 개라도 사용할 수 있다.
사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다.
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어질 수도 있다.
첫째 줄에 사용한 동전의 최소 개수를 출력한다. 불가능한 경우에는 -1을 출력한다.
1
5
12
>> 3
import sys
n, k = map(int, sys.stdin.readline().split())
coins = [int(sys.stdin.readline()) for _ in range(n)]
dp = [10001 for _ in range(k+1)]
dp[0] = 0
for idx in range(1, k+1):
for coin in coins:
if idx < coin: continue
dp[idx] = min(dp[idx], dp[idx-coin] + 1)
if dp[k] == 10001: print(-1)
else: print(dp[k])
dp 배열
: K원의 범위가 최대 10000
원이므로 10001
로 초기화dp[k]
가 업데이트 되지 않았다면(10001 이라면) 주어진 동전으로 k 가치를 만들지 못함을 의미dp[0] = 0
: 0원을 만드는데 필요한 동전의 개수는 0
dp[idx] = min(dp[idx], dp[idx-coin] + 1)
→ 예시) 입력받은 동전(coins= [1, 3, 5]
) 중 , 7원 (dp[7]
) 일때 최소 동전의 개수 구하기
if idx < coin: continue
: 처리 중인 동전(idx=3원) 보다 입력받은 동전(5원)이 작을 때 금액 계산을 막기 위한 작업
dp[idx] = min(dp[idx], dp[idx-coin] + 1)
→ 예시) 입력받은 동전(coins= [1, 3, 5]
) 중 , 7원 (dp[7]
) 일때 최소 동전의 개수 구하기
최소 개수↓ | 0원 | 1원 | 2원 | 3원 | 4원 | 5원 | 6원 | 7원 |
---|---|---|---|---|---|---|---|---|
dp[0] | 0 | 10001 | 10001 | 10001 | 10001 | 10001 | 10001 | 10001 |
dp[1] | 0 | 1 | 10001 | 10001 | 10001 | 10001 | 10001 | 10001 |
dp[2] | 0 | 1 | 2 | 10001 | 10001 | 10001 | 10001 | 10001 |
dp[3] | 0 | 1 | 2 | 3 | 10001 | 10001 | 10001 | 10001 |
dp[4] | 0 | 1 | 2 | 3 | 4 | 10001 | 10001 | 10001 |
dp[5] | 0 | 1 | 2 | 3 | 4 | 1 | 10001 | 10001 |
dp[6] | 0 | 1 | 2 | 3 | 4 | 1 | 2 | 10001 |
dp[6] | 0 | 1 | 2 | 3 | 4 | 1 | 2 | _3 _ |