문제에서 주어진 조건으로 예를 들자면
이 과정에서 2원짜리 동전을 추가하여 만드는 경우를 보면,
가치의 합 2: 2원
가치의 합 3: 2원
가치의 합 4: 2원 + 2원
가치의 합 5: 2원 + 2원
가치의 합 6: 2원 + 2원 + 2원
가치의 합 7: 2원 + 2원 + 2원
가치의 합 8: 2원 + 2원 + 2원 + 2원
...
이런식으로 2원짜리 동전이 추가가 된다. 2원짜리 동전이 하나 추가 될때마다 경우의 수가 하나 늘어나게 된다.
5원짜리 동전을 추가하여 만드는 경우를 보면,
가치의 합 5: 5원
가치의 합 6: 5원
가치의 합 7: 5원
가치의 합 8: 5원
가치의 합 9: 5원
가치의 합 10: 5원 + 5원
가치의 합 11: 5원 + 5원
...
이런식으로 5원짜리 동전이 추가가 된다. 5원짜리 동전이 하나 추가 될때마다 경우의 수가 하나 늘어나게 된다.
따라서 점화식은 dp[j] = dp[j] + dp[j - coin[i]]가 되게 되고,
이러한 점화식을 코드로 구현하면 아래와 같다
for i in range(N): #i는 coin의 index
for j in range(coin[i], K+1): #j는 가치의 합, dp[j]는 가치의 합이 j가 되는 경우의 수
dp[j] += dp[j - coin[i]]
import sys
N, K = map(int, sys.stdin.readline()[:-1].split())
coin = []
for n in range(N):
coin.append(int(sys.stdin.readline()[:-1]))
dp = [0 for _ in range(K+1)] #dp[j]는 가치의 합이 j가 되는 경우의 수
dp[0] = 1
for i in range(N): #i는 coin의 index
for j in range(coin[i], K+1): #j는 가치의 합, dp[j]는 가치의 합이 j가 되는 경우의 수
dp[j] += dp[j - coin[i]]
print(dp[K])