문제 링크
2294번: 동전 2
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어
www.acmicpc.net
문제 풀이
- 동전이 1만 있다면 다음과 같이 작성할 수 있다.
n | 0 | 1 | 2 | 3 | 4 | 5 | ... | 14 | 15 |
dp[n] | 0 | 1 | 2 | 3 | 4 | 5 | ... | 14 | 15 |
- 동전이 1, 5가 있다면 5이상부터는 값이 달라진다.
n | 0 | 1 | ... | 5 | 6 | 7 | ... | 14 | 15 |
dp[n] | 0 | 1 | ... | 1 | 2 | 3 | ... | 6 | 3 |
- n이 5일 때, 1을 5번 사용하는 것보다 5를 1번 사용하는 것이 최소로 사용하기 때문이다.
- 각 동전의 값부터 시작하여 계산한다. 현재 위치(i)에서 동전 값(coin)만큼 뺀 위치(i-coin)의 값(dp[i-coin])에서 1을 더한 값과 현재 위치의 값(dp[i])를 비교하여 더 작은 값을 저장하도록 한다.
전체 코드
import sys
n, k = map(int, sys.stdin.readline().split())
coins = [int(sys.stdin.readline().strip()) for _ in range(n)]
dp = [100001] * (k+1)
dp[0] = 0
for coin in coins:
for i in range(coin, k+1):
dp[i] = min(dp[i], dp[i-coin] + 1)
if dp[-1] == 100001:
print(-1)
else:
print(dp[-1])
반응형
'Coding Test > BOJ' 카테고리의 다른 글
[백준/Python] 14502 연구소 (0) | 2024.03.28 |
---|---|
[백준/Python] 19539 사과나무 (0) | 2024.03.22 |
[백준/Python] 15686 치킨 배달 (0) | 2024.03.20 |
[백준/Python] 2230 수 고르기 (0) | 2024.03.15 |
[백준/Python] 2251 물통 (2) | 2024.03.14 |