동전 조합의 경우의 수가 아닌, 조합 시 최소 동전 개수를 풀이하는 것이므로, 합이 아닌 minimal value를 반환한다. 즉 식이 dp[coin + i] += dp[i] 에서 dp[coin + i] = min(dp[coin + i], dp[i] + 1) 로 변환된다.
마지막에 minimal value가 업데이트되지 않은 경우는 모든 조합에서 k원을 반환하는 게 불가능하다는 의미가 되므로, -1를 반환한다.
동전의 가치가 중복될 수 있으나, 동전 자체가 중복되지는 않는다. 따라서 위 DP 풀이에 변화를 주지 않는다.
풀이 코드
import sys
input = sys.stdin.readline
MAX = float('inf')
n, k = map(int, input().split())
coin_list = [int(input()) for _ in range(n)]
dp = [MAX]*(k+1)
dp[0] = 0
for coin in coin_list :
for i in range(k-coin+1) :
dp[i+coin] = min(dp[i+coin], dp[i] + 1)
print(dp[-1] if dp[-1] < MAX else -1)