ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

2294번: 동전 2

첫째 쀄에 n, kκ°€ 주어진닀. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) λ‹€μŒ n개의 μ€„μ—λŠ” 각각의 λ™μ „μ˜ κ°€μΉ˜κ°€ 주어진닀. λ™μ „μ˜ κ°€μΉ˜λŠ” 100,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€. κ°€μΉ˜κ°€ 같은 동전이 μ—¬λŸ¬ 번 μ£ΌοΏ½οΏ½

www.acmicpc.net

 

문제 풀이

 μ•žμ„œ 닀룬 λ™μ „ 1은 동전을 ν•©ν•˜μ—¬ Kκ°€ λ˜λŠ” 경우의 수λ₯Ό μ°ΎλŠ” λ¬Έμ œμ˜€μ§€λ§Œ, 이 λ¬Έμ œλŠ” 동전을 ν•©ν•˜μ—¬ Kκ°€ 될 λ•Œ, μ΅œμ†Œμ˜ 동전을 μ‚¬μš©ν•˜μ—¬ Kκ°€ λ˜λŠ” 경우λ₯Ό λ°˜ν™˜ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

 

 

μœ„μ™€ 같이 λ™μ „μ˜ κ°€μΉ˜μ— 따라, μ‚¬μš©ν•˜μ—¬μ•Ό λ˜λŠ” λ™μ „μ˜ 개수λ₯Ό ꡬ할 수 μžˆλ‹€. μ•žμ„œ 닀룬 동전 1은 λ™μ „μ˜ 합이 Kκ°€ λ˜λŠ” 경우의 수λ₯Ό μ°ΎκΈ° μœ„ν•΄ 경우의 μˆ˜λ“€μ„ λˆ„μ ν•˜μ˜€λ‹€. 이와 달리 이 λ¬Έμ œμ—μ„œλŠ” μ΅œμ΄ˆμ— κ°€μž₯ μž‘μ€ κ°€μΉ˜μ˜ λ™μ „μœΌλ‘œ κΈˆμ•‘μ„ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” λ™μ „μ˜ 수λ₯Ό κ΅¬ν•˜κ³ , λ‹€μŒμ˜ κ°€μΉ˜μ— λŒ€ν•΄μ„œλŠ”, ν˜„μž¬ λ©”λͺ¨μ΄μ œμ΄μ…˜ 된 κ°’κ³Ό ν•΄λ‹Ή λ™μ „μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” 경우λ₯Ό λΉ„κ΅ν•˜μ—¬ μ΅œμ†Œ 값을 κΈ°λ‘ν•΄λ‘λŠ” 방식을 μ‚¬μš©ν•œλ‹€.

 

 μ˜ˆλ₯Ό λ“€μ–΄, 2λ₯Ό 2인 λ™μ „μœΌλ‘œλŠ” 1개, 1인 λ™μ „μœΌλ‘œλŠ” 2개λ₯Ό μ‚¬μš©ν•˜μ—¬μ•Ό ν•œλ‹€. λ”°λΌμ„œ μž‘μ€ 값인 1을 2λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” μ΅œμ†Œ λ™μ „μˆ˜λ‘œ κΈ°λ‘ν•œλ‹€. λ˜ν•œ λ‚˜λ¨Έμ§€ κΈˆμ•‘λ“€μ€ (10 - 2), (8 - 2), (6 - 2), (4 - 2)와 같이 이전에 λ©”λͺ¨μ΄μ œμ΄μ…˜ 된 값을 ν™œμš©ν•˜μ—¬ ꡬ할 수 μžˆλ‹€.

 

μ½”λ“œ

from sys import stdin


if __name__ == '__main__':
    n, k = map(int, stdin.readline().split())
    coins = [int(stdin.readline()) for _ in range(n)]
    dp = [0] + [k + 1] * k

    for coin in coins:
        for price in range(coin, k + 1):
            dp[price] = min(dp[price], dp[price - coin] + 1)

    print(dp[k] if dp[k] != k + 1 else -1)
728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€