문제 링크
https://www.acmicpc.net/problem/2294
문제 설명
문제
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])
결과
다른 사람의 코드
리뷰
'알고리즘 문제 > 백준' 카테고리의 다른 글
백준 1038번: 감소하는 수 Python 풀이 및 정답 코드 (0) | 2021.12.19 |
---|---|
백준 2667번: 단지번호붙이기 Python 풀이 및 정답 코드 (0) | 2021.12.19 |
백준 3085번: 사탕 게임Python 풀이 및 정답 코드 (0) | 2021.11.21 |
백준 1789번: 수들의 합 python 풀이 및 정답 코드 (0) | 2021.11.19 |
백준 2293번: 동전 1 Python 풀이 및 정답 코드 (0) | 2021.11.14 |