본문으로 바로가기

[백준/Python(파이썬)] 2293 동전 1

category PS/백준 2021. 3. 19. 23:55
문제

n가지 종류의 동전이 있다. 각각의 동전이 나타내는 가치는 다르다. 이 동전을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그 경우의 수를 구하시오. 각각의 동전은 몇 개라도 사용할 수 있다.

사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다.

입력

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

출력

첫째 줄에 경우의 수를 출력한다. 경우의 수는 231보다 작다.

풀이

가치의 합이 i(1 <= i <= k)원이 되는 경우의 수를 구하는 부분 문제로 세분화 함


ex) 1, 2, 5원 동전으로 10원을 만드는 경우
1. 1원짜리 동전만 사용해서 만드는 경우 고려
-> dp[1] = dp[2] = ... = dp[10] = 1
2. 1원, 2원을 사용해서 만드는 경우
-> 2원을 포함시키지 않는 방법 = 1원만 사용하는 경우는 이미 계산함. 이 값이 dp[k]
-> 2원을 포함하는 방법인 dp[k-2]를 더하면 됨


** w원짜리 동전을 추가할 때 dp[k] += dp[k-w] 점화식 성립

 

점화식 종이에 적어서 푸는 연습도 다시 해야겠다

소스코드
n, k = map(int, input().split())  # n: 동전의 종류, k: 가치의 합
c = []
for i in range(n):
    c.append(int(input()))
dp = [1] + [0 for _ in range(k)]
for i in c:
    for j in range(1, k+1):
        if j - i >= 0:
            dp[j] += dp[j-i]
print(dp[k])

Git : github.com/jisun1125/algorithm-problem-solving/blob/main/baekjoon/no_2293.py

문제 : www.acmicpc.net/problem/2293