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

728x90
λ°˜μ‘ν˜•

문제

 

1106번: ν˜Έν…”

첫째 쀄에 C와 ν˜•νƒμ΄κ°€ 홍보할 수 μžˆλŠ” λ„μ‹œμ˜ 개수 N이 주어진닀. CλŠ” 1,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄κ³ , N은 20보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” 각 λ„μ‹œμ—μ„œ 홍보할 λ•Œ

www.acmicpc.net

 

문제 풀이

 μ μ–΄λ„ μœ μΉ˜ν•΄μ•Ό ν•˜λŠ” 고객 수 Cλͺ…κ³Ό λ„μ‹œμ˜ 개수 N이 주어진닀. μ΄λ•Œ 각 λ„μ‹œμ—λŠ” ν™λ³΄λΉ„μš©κ³Ό κ·Έ λΉ„μš©μœΌλ‘œ μœ μΉ˜ν•  수 μžˆλŠ” 고객에 λŒ€ν•œ 정보가 μ œκ³΅λœλ‹€. μ΄λ•Œ, μ΅œμ†Œ λΉ„μš©μœΌλ‘œ 적어도 Cλͺ…μ˜ 고객의 수λ₯Ό μœ μΉ˜ν•˜λŠ” 경우λ₯Ό λ°˜ν™˜ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

 

 λ¬Έμ œλ₯Ό ν’€κΈ° μœ„ν•΄μ„œλŠ” λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ 톡해, λ‹€μŒκ³Ό 같이 점화식을 μ„Έμš°λ©΄ ν•΄κ²°ν•  수 μžˆλ‹€. `dp[Nλͺ…μ˜ 고객을 μœ μΉ˜ν•˜λŠ”λ° λ“œλŠ” λΉ„μš©] = min(dp[Nλͺ…μ˜ 고객을 μœ μΉ˜ν•˜λŠ”λ° λ“œλŠ” λΉ„μš©], dp[Nλͺ…μ˜ 고객을 μœ μΉ˜ν•˜λŠ”λ° λ“œλŠ” λΉ„μš© - ν˜„μž¬ λ°©λ¬Έν•œ λ„μ‹œμ˜ 유치 κ°€λŠ₯ν•œ μΈμ›μˆ˜) + cost)`

 

 μ΄λ₯Ό λ‹€μ‹œ ν’€μ–΄μ„œ μ„€λͺ…ν•œλ‹€λ©΄, ν˜„μž¬ 유치 κ°€λŠ₯ν•œ 고객과 이전에 λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ 톡해 μœ μΉ˜ν•œ κ°’ 쀑 μ΅œμ†Ÿκ°’μ„ μ°Ύμ•„ λ‹€μ‹œ κΈ°λ‘ν•˜λŠ” 방식을 μ·¨ν•˜λŠ” 방식을 톡해 μ›ν•˜λŠ” 값을 찾을 수 μžˆλ‹€. 문제λ₯Ό ν‘ΈλŠ” 데 μžˆμ–΄ μ£Όμ˜ν•  점은 μ΅œμ΄ˆμ— μ œμΆœν•  λ•ŒλŠ” Cκ°€ 12인 경우 `dp[-1]`이 닡이 λ˜λ―€λ‘œ, λ‹Ήμ—°νžˆ 그런 μ‹μœΌλ‘œ μƒκ°ν•˜κ³  μ œμΆœν•˜μ˜€μ§€λ§Œ μ˜€λ‹΅μ΄μ—ˆλ‹€. μ΄λŠ”, 적어도 Cλͺ…을 λŠ˜λ €μ•Ό ν•˜κΈ°μ— C의 μ΅œλŒ“κ°’μ€ 100을 κ³ λ €ν•˜μ—¬ DPλ₯Ό 계산해주어야 ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

μ½”λ“œ

from sys import stdin, maxsize


if __name__ == '__main__':
    # 확보해야할 고객, λ„μ‹œμ˜ 수
    C, N = map(int, stdin.readline().split())
    # κ΄‘κ³  정보
    ad = [list(map(int, stdin.readline().split())) for _ in range(N)]
    # 적어도 Cλͺ…을 λŠ˜λ €μ•Ό ν•˜κΈ°μ—, 고객의 수 μ΅œλŒ€ 값을 더해 쀄 ν•„μš”κ°€ 있음
    dp = [0] + [maxsize] * (C + 100)

    for cost, customer in ad:
        for cur_customer in range(customer, C + 101):
            dp[cur_customer] = min(dp[cur_customer], dp[cur_customer - customer] + cost)

    print(min(dp[C:C + 101]))

 

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