백준 2294번: 동전2 Python 풀이 및 정답 코드

문제 링크

https://www.acmicpc.net/problem/2294

 

2294번: 동전 2

첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주

www.acmicpc.net

 

 

문제 설명

문제

n가지 종류의 동전이 있다. 이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그러면서 동전의 개수가 최소가 되도록 하려고 한다. 각각의 동전은 몇 개라도 사용할 수 있다.

사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다.

입력

첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어질 수도 있다.

출력

첫째 줄에 사용한 동전의 최소 개수를 출력한다. 불가능한 경우에는 -1을 출력한다.

 

 

문제 풀이

동적 프로그래밍 (다이나믹 프로그래밍)이다.

다이나믹을 풀려면 먼저 점화식을 세워야한다.
1원, 5원, 12원 짜리 동전이 있고 어떤 값을 15라고 할 때 15를 만들 수 있는 동전의 최소 갯수는, 15-1, 15-5, 15-12 를 만드는 동전의 최소 갯수에 1을 더한 값이다.
따라서 점화식은 다음과 같은 형태이다.
dp[i] = min(dp[i-coins[0]], ... , dp[i-coins[-1]]) + 1

동전이 중복될 수 있으므로 set에 담아준다.

 

 

코드

n, k = map(int, input().split())
coins = [int(input()) for _ in range(n)]

dp = [0 for i in range(k + 1)]
    
for i in range(1, k + 1):
    a = []
    for j in coins:
        if j <= i and dp[i - j] != -1:
            a.append(dp[i - j])
    if not a:
        dp[i] = -1
    else:
        dp[i] = min(a) + 1
        
print(dp[k])

 

 

결과

 

 

 

다른 사람의 코드

 

 

 

리뷰