
동전 짤을 찾기가 힘들어서 계속 도지코인 사진만 올리게 되네요 허
coins를 정의합니다.coins[i]는 i원을 주어진 동전으로 만들 수 있는 경우의 수를 뜻합니다.1원 + 1원 + 5원과 5원 + 1원 + 1원은 같은 경우로 계산됩니다.테이블 초기화
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
coins[i] | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0원을 만드는 경우는, 아무 동전도 사용하지 않는 1가지 방법이 있으니 coins[0] = 1입니다.0으로 초기화됩니다.1단계) 1원이 있을 때
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
1원 사용 전 coins[i] | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1원 사용 후 coins[i] | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
i + 1원을 만들 때, i원을 만드는 모든 경우에 1원 동전 하나를 추가하면 됩니다.i에 대해 coins[i + 1] += coins[i]로 갱신할 수 있습니다.i = 0일 때 coins[1] += coins[0] -> coins[1] = 1 + 0 = 1로 갱신.i = 1일 때 coins[2] += coins[1] -> coins[2] = 1 + 0 = 1로 갱신. 이때 coins[1]의 값이 기존의 0이 아니라, 앞서 갱신된 1임에 유의하세요.i = 9일 때 coins[10] += coins[9] -> coins[10] = 1 + 0 = 1로 갱신.i > 9부턴 i + 1 > 10으로 범위를 벗어나니 갱신하지 않음.coins[10] = 1이 됩니다. 2단계) 1, 5원이 있을 때
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
5원 사용 전 coins[i] | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
5원 사용 후 coins[i] | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 3 |
i + 5원을 만들 때, i원을 만드는 모든 경우에 5원 동전 하나를 추가할 수 있습니다.i에 대해 coins[i + 5] += coins[i]로 갱신할 수 있습니다.i = 0일 때 coins[5] += coins[0] -> coins[5] = 1 + 1 = 2로 갱신.i = 1일 때 coins[6] += coins[1] -> coins[6] = 1 + 1 = 2로 갱신.i = 5일 때 coins[10] += coins[5] -> coins[10] = 1 + 2 = 3으로 갱신. 이때 coins[5]의 값이 기존의 1이 아니라, 앞서 갱신된 2임에 유의하세요.i > 5부턴 i + 5 > 10으로 범위를 벗어나니 갱신하지 않음.coins[i]를 더할 때, 매 차례 갱신된 값을 더해야 함에 유의하세요.coins[10] = 3이 됩니다. 3단계) 1, 5원, 10원이 있을 때
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
10원 사용 전 coins[i] | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 3 |
10원 사용 후 coins[i] | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 4 |
i + 10원을 만들 때, i원을 만드는 모든 경우에 10원 동전 하나를 추가할 수 있습니다.i에 대해 coins[i + 10] += coins[i]으로 갱신할 수 있습니다.i = 0일 때 coins[10] += coins[0] -> coins[10] = 3 + 1 = 4로 갱신.i > 0부턴 i + 10 > 10으로 범위를 벗어나니 갱신하지 않음.coins[10] = 4가 됩니다.점화식
M원을 만드는 문제에서 k의 단위를 가진 동전을 확인할 때i + k <= M을 만족하는 각 i에 대해coins[i + k] += coins[i]로 갱신해 주면 됩니다.k원 동전을 새로 사용하는 경우, i원을 만드는 모든 경우에 k원을 추가해 i + k원을 만듭니다.import sys
input = sys.stdin.readline
T = int(input())
for _ in range(T):
# 동전 단위의 수
N = int(input())
values = list(map(int, input().split()))
# 만들고자 하는 금액
M = int(input())
# coins[i]: i원을 만들 수 있는 경우의 수를 저장하는 리스트
coins = [0] * (M + 1)
coins[0] = 1 # 0원을 만들 땐 아무 동전을 안 쓰는 1개의 경우 존재
# k의 단위를 가진 동전을 확인하면서, 경우의 수를 갱신
for k in values:
for i in range(M + 1):
# 금액 i + k를 만들기 위해, 이전 금액 i에서 k를 추가
if i + k <= M:
coins[i + k] += coins[i]
# M원을 만들 수 있는 경우의 수 출력
print(coins[M])
도지 볼 때마다 눈물이 나오네...흑흑