문제
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
'PS > 백준' 카테고리의 다른 글
[백준/Python(파이썬)] 15989 1, 2, 3 더하기 4 (0) | 2021.03.21 |
---|---|
[백준/Python(파이썬)] 2294 동전 2 (0) | 2021.03.20 |
[백준/Python(파이썬)] 17087 숨바꼭질 6 (0) | 2021.03.19 |
[백준/Python(파이썬)] 15666 N과 M (12) (0) | 2021.03.18 |
[백준/Python(파이썬)] 1525 퍼즐 (0) | 2021.03.18 |