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

728x90
λ°˜μ‘ν˜•

문제

 

2293번: 동전 1

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

www.acmicpc.net

 

문제 풀이

 λ‹€λ₯Έ κ°€μΉ˜λ₯Ό 가진 동전이 μ£Όμ–΄μ§ˆ λ•Œ, ν•΄λ‹Ή λ™μ „λ“€μ˜ ν•©μœΌλ‘œ Kκ°€ λ˜λŠ” 경우의 수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€. 문제λ₯Ό ν’€κΈ° μœ„ν•΄μ„œλŠ” 각 동전 λ³„λ‘œ κΈˆμ•‘μ„ 계산할 수 μžˆλŠ” 경우의 수λ₯Ό κ΅¬ν•˜κ³  이λ₯Ό λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ 톡해 λˆ„μ ν•˜μ—¬ 닡을 λ„μΆœν•  수 μžˆλ‹€.

 

 μœ„와 같이 λ™μ „μ˜ κ°€μΉ˜μ— 따라 λ°œμƒν•  수 μžˆλŠ” 경우의 수λ₯Ό ꡬ할 수 μžˆλ‹€. κ°€μž₯ μž‘μ€ λ™μ „μœΌλ‘œ ꡬ할 수 μžˆλŠ” 경우의 μˆ˜λŠ” κΈˆμ•‘μ— 따라 1κ°€μ§€μ”©λ§Œ μ‘΄μž¬ν•˜κ²Œ λœλ‹€. ν•˜μ§€λ§Œ κ·Έ λ‹€μŒμœΌλ‘œ 큰 κ°€μΉ˜μ˜ 동전에 λŒ€ν•œ 경우의 수λ₯Ό κ³„μ‚°ν•˜κΈ° μœ„ν•΄μ„œλŠ” 이전에 κ΅¬ν•œ 경우의 수λ₯Ό ν•©μ‚°ν•΄μ£Όμ–΄μ•Ό λœλ‹€.

 

 μ˜ˆλ₯Ό λ“€μ–΄, λ™μ „μ˜ κ°€μΉ˜κ°€ 2일 λ•Œ 3을 ꡬ할 수 μžˆλŠ” 경우의 μˆ˜λŠ” 3 - 2λŠ” 1이 λ˜λ―€λ‘œ 1을 ꡬ할 수 μžˆλŠ” 경우의 μˆ˜μ΄λ‹€. λ˜ν•œ λ™μ „μ˜ κ°€μΉ˜κ°€ 4일 λ•Œ 4λ₯Ό ꡬ할 수 μžˆλŠ” 경우의 μˆ˜λŠ” 4 -2, 2λ₯Ό ꡬ할 수 μžˆλŠ” 경우의 μˆ˜λŠ” 1일 λ•Œ ν•œκ°€μ§€, 2일 λ•Œ ν•œκ°€μ§€ μ΄λ―€λ‘œ 총 2가지가 λœλ‹€. 이런 μ‹μœΌλ‘œ λͺ¨λ“  동전 κ°€μΉ˜μ— λŒ€ν•œ 값을 λˆ„μ ν•˜μ—¬ μœ„μ˜ Totalκ³Ό 같이 K에 λŒ€ν•œ 경우의 수λ₯Ό 찾을 수 μžˆλ‹€.

 

from sys import stdin


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

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

    print(dp[k])

 

728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€