[백준] 2294: 동전 2

JIN·2021년 12월 16일
0

DP

DP 문제입니다.
동전 1과는 조금 다른 방식으로 접근해야합니다.

lst는 처음에 꼭 정렬해주어야 올바른 답이 나옵니다.
왜냐하면 바텀업 방식이라서 작은 숫자부터 시작하기 때문입니다.

  1. k 의 범위가 10000까지 이므로 d는 10001로 초기화 해주고
    k가 각 동전의 단위라면 최솟값은 1이므로 d[0] = 1 입니다.
  1. k가 동전의 단위로 나누어진다면
    k를 동전의 단위로 나눈 몫과 d[k]의 값 중 min 값을 갱신해줍니다.

2.k가 동전의 단위로 나누어지지 않는다면
d[k]와 d[j-k]의 값 중 min 값으로 갱신해준다.

n, k = map(int, input().split())
lst = []
for i in range(n):
	lst.append(int(input()))
lst.sort()
d = [10001] * (k+1)
d[0] = 1
for i in lst:
	for j in range(i, k+1):
		if j >= i:
			if j % i == 0:
				d[j] = min((j // i), d[j])
			else:
				d[j] = min(d[j], d[j-i]+1)

if d[k] == 10001:
	print(-1)
	exit()
print(d[k])
profile
배우고 적용하고 개선하기

0개의 댓글