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

728x90
λ°˜μ‘ν˜•

문제

 

12865번: ν‰λ²”ν•œ λ°°λ‚­

첫 쀄에 λ¬Όν’ˆμ˜ 수 N(1 ≤ N ≤ 100)κ³Ό μ€€μ„œκ°€ 버틸 수 μžˆλŠ” 무게 K(1 ≤ K ≤ 100,000)κ°€ 주어진닀. 두 번째 쀄뢀터 N개의 쀄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 ν•΄λ‹Ή 물건의 κ°€μΉ˜ V(0 ≤ V ≤ 1,000)

www.acmicpc.net

 

문제 풀이

  • 리슀트λ₯Ό λ§Œλ“€ λ•Œ, list[μ„ νƒν•˜κ³ μž ν•˜λŠ” μ•„μ΄ν…œμ˜ 수][μ΅œλŒ€ κ°€μΉ˜]둜 2차원 배열을 λ§Œλ“ λ‹€.
  • list[0]은 아무것도 μ—°μ£Όν•˜μ§€ μ•Šμ€ μƒνƒœ, μ΅œμ΄ˆμ— λ³Όλ₯¨μ„ μ μš©ν•œ μƒνƒœμ΄λ―€λ‘œ list[0]의 값듀은 0이닀.
  • 2쀑 λ°˜λ³΅λ¬Έμ„ μˆœνšŒν•˜λ©΄μ„œ list[1], list[2] ... 둜 μ ‘κ·Όν•˜λ©° 가방에 넣을 수 μžˆλŠ” μ•„μ΄ν…œμ˜ μƒνƒœλ₯Ό κΈ°λ‘ν•œλ‹€.
  • n * m 만큼의 λ°˜λ³΅λ¬Έμ„ μˆœνšŒν•˜λ©΄, μ΅œλŒ€ κ°’μ–΄μΉ˜μ„ μ²΄ν¬ν•œλ‹€.
  • 즉, 이전에 μ„ νƒν•œ μ•„μ΄ν…œμ˜ κ°’μ–΄μΉ˜λ₯Ό μœ μ§€ν•˜λ©΄μ„œ, ν˜„μž¬ μ„ νƒν•œ μ•„μ΄ν…œμ„ λ‹΄μ•˜μ„ λ•Œμ˜ μƒνƒœλ₯Ό λ°˜μ˜ν•œλ‹€.
    • μ•„μ΄ν…œμ„ 담을 수 μžˆλŠ”κ°€?, κ°’μ–΄μΉ˜λŠ” 이전과 λΉ„κ΅ν•˜μ—¬ μ–΄λŠκ²ƒμ„ μ„ νƒν•˜λŠ”κ²Œ μ΅œλŒ€κ°’μΈκ°€?
  • λ”°λΌμ„œ 점화식은 κ·Έλ¦Όκ³Ό 같이, ν˜„μž¬ μ•„μ΄ν…œμ„ 가방에 넣을 수 μžˆλŠ” κ²½μš°μ— ν•΄λ‹Ή μ•„μ΄ν…œμ˜ κ°’μ–΄μΉ˜λ₯Ό λ°˜μ˜ν•˜λŠ”κ°€? μ•„λ‹Œκ°€μ— 따라 μ΅œλŒ€κ°’μ„ 계산할 수 μžˆλ‹€.

 

 

μ½”λ“œ

from sys import stdin


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

    for idx in range(1, n + 1):
        weight, value = items[idx]
        for bag_weight in range(1, k + 1):
            if bag_weight < weight:
                dp[idx][bag_weight] = dp[idx - 1][bag_weight]
            else:
                dp[idx][bag_weight] = \
                    max(dp[idx - 1][bag_weight - weight] + value, dp[idx - 1][bag_weight])

    print(dp[n][k])

 

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