반응형
https://www.acmicpc.net/problem/2293
2293번: 동전 1
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다.
www.acmicpc.net
💡IDEA
동적계획법을 사용하는 문제이다.
1을 k번 더한 수를 합해서 점점 줄여가며 개수를 구하는 것은 알았으나, 점화식을 어떻게 써야할 지가 어려웠다.
입력받은 coins에서 동전의 가치 i를 사용하여 dp를 구성해야 하는데, i~k 사이의 수 j번째 값은 j 값 + (j-i) 값을 구할 수 있다.
쉽게 말하자면, i 값을 가진 동전을 사용하는 경우와, 사용하지 않는 경우를 더해서 계산한다고 생각하면 된다.
예를 들어 5를 1원과 2원짜리로 구성한다면, 5 = 1+1+1+1+1 = 2+1+1+1 = 2+2+1 인데, 2원을 사용하는 경우는 곧 5-2=3을 1원과 2원으로 구성하는 3 = 1+1+1 = 2+1 인 2가지 경우에 +2씩 해주는 것과 1원만 사용하는 1+1+1+1+1인 것을 더한 3가지 경우가 되는 것이다.
📌CODE
import sys
input = sys.stdin.readline
n, k = map(int, input().split())
coins = [int(input().strip()) for _ in range(n)]
dp = [0]*(k+1)
dp[0] = 1
for i in coins:
for j in range(i, k+1):
dp[j] += dp[j-i]
print(dp[k])
반응형
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ][python] 2805. 나무 자르기 (0) | 2022.07.26 |
---|---|
[BOJ][python] 6588. 골드바흐의 추측 (0) | 2022.07.21 |
[BOJ][python] 1759. 암호 만들기 (0) | 2022.07.21 |
[BOJ][python] 2583. 영역 구하기 (0) | 2022.07.21 |
[BOJ][python] 11057. 오르막 수 (0) | 2022.07.21 |