Algorithm/Online judge

[백준] 2294번 > 동전 2

민철킹 2021. 4. 13. 11:28

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을 출력한다.

 


풀이

점화식

dp[i] = min(dp[i-coins[0]], dp[i-coins[1]], ...........dp[i-coins[n-1]) + 1

 

즉, 만약 위와 같이 입력이 들어왔다면,

dp[3] = min(dp[2], dp[-2]. dp[-9]) + 1 이 되는데 리스트 인덱스에 음수값은 존재하지않으므로

dp[2] + 1이 된다.

import sys
input = sys.stdin.readline
n, k = map(int, input().split())
coins = [int(input()) for _ in range(n)]
dp = [0 for _ in range(k+1)]
dp[1] = 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])

 

반응형

'Algorithm > Online judge' 카테고리의 다른 글

[백준] 1753번 > 최단 경로  (0) 2021.04.28
[백준] 1735번 > 분수 합  (0) 2021.04.27
[백준] 1351번 > 무한 수열  (0) 2021.04.13
[백준] 2109번 > 순회강연  (0) 2021.04.07
[백준] 2812번 > 크게 만들기  (0) 2021.04.07