[문제해결 - DP] BOJ2294 / 동전 2 / 골드 5 (Python, 파이썬)

oldshoe·2024년 3월 3일
0

알고리즘 문제

목록 보기
10/51

백준2294 문제 보러가기

문제

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

입력

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

출력

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

예제 입력 1

3 15
1
5
12

예제 출력 1

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])         
profile
toomuxi : There are many things in the world that I want to do

0개의 댓글