문제
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 |