내 잡다한 노트

2294 동전2 파이썬 본문

백준, 프로그래머스(파이썬)

2294 동전2 파이썬

peanutwalnut 2022. 3. 13. 22:28

문제

https://www.acmicpc.net/problem/2294

 

2294번: 동전 2

첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주

www.acmicpc.net

 

소스코드

import sys
n, k = map(int, sys.stdin.readline().split())
dp = [10001] * (k+1)
dp[0] = 0
coin = []
for _ in range(n):
    coin.append(int(input()))

for c in coin:
    for p in range(c, k+1):
        if p-c >= 0:
            dp[p] = min(dp[p], dp[p-c]+1)

if dp[k] != 10001:
    print(dp[k])
else:
    print(-1)

2293번 동전1문제와 유사하다

dp는 합이 p일때, 최소 동전의 개수이다.

최소값을 구하라 했으니 dp 배열의 초기값을 크게 잡고 합이 0일때는 0이다.

dp[p] = min(dp[p], dp[p-c]+1)

p일때 최소 값을 넣어주기 위해 이전 동전에서 구했던 dp[p]와 dp[p-c]+1의 최솟값을 dp[p]에 넣어준다

dp[p-c]+1은 현재 동전 상태에서의 p일때 동전개수와 같다