1535 : μ•ˆλ…•

Contents

1535 : μ•ˆλ…•#

  • https://d2gd6pc034wcta.cloudfront.net/tier/9.svg 싀버2

μ‹œκ°„μ œν•œ

λ©”λͺ¨λ¦¬μ œν•œ

μ •λ‹΅λΉ„μœ¨

2초

128MB

54%

input

  1. n : μ‚¬λžŒμˆ˜

  2. List[μžƒλŠ” 체λ ₯]

  3. List[μ–»λŠ” 기쁨]

체λ ₯이 0이 되면 μ£½μ–΄μ„œ 아무 기쁨을 λͺ» λŠλ‚ŒμœΌλ‘œ μ•„μ˜ˆ μ•ˆν•˜λŠ” 경우λ₯Ό 빼면은 0 이 될 수 μ—†λ‹€.

output : max(기쁨)

λ”± 봐도 dp 문제처럼 λ³΄μž„.

100이 λ˜μ§€ μ•ŠλŠ” μ„ μ—μ„œ   
κ·Έλƒ₯ λ‹€ ν‘μˆ˜ν•œλ‹€λŠ” λ§ˆμΈλ“œ?
근데 λ¬Έμ œλŠ” κ°€μ„±λΉ„κ°€ μ•ˆμ’‹μ€ 것에 λŒ€ν•΄μ„œλŠ” μ–΄λ–»κ²Œ 처리λ₯Ό 해야할지?
κ·Έλƒ₯ f(n) = max(f(n-1), f(n-2))? μ΄λŸ°μ‹μœΌλ‘œ μ ‘κ·Όν•΄μ•Όν•˜λ‚˜?
  • N: μ•„μ΄ν…œμ˜ 수

  • cost: μ•„μ΄ν…œμ˜ 무게 리슀트

  • value: μ•„μ΄ν…œμ˜ κ°€μΉ˜ 리슀트

  • dp: 동적 ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ 2차원 λ°°μ—΄. dp[i][j]λŠ” i번째 μ•„μ΄ν…œκΉŒμ§€ κ³ λ €ν•˜κ³ , λ°°λ‚­μ˜ μš©λŸ‰μ΄ j일 λ•Œ 얻을 수 μžˆλŠ” μ΅œλŒ€ κ°€μΉ˜λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.

  1. costκ³Ό value 리슀트의 맨 μ•žμ— 0을 μΆ”κ°€ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ 0을 μΆ”κ°€ν•˜λŠ” μ΄μœ λŠ” μ•„μ΄ν…œ μΈλ±μŠ€μ™€ μš©λŸ‰μ„ 1λΆ€ν„° μ‹œμž‘ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€. λ”°λΌμ„œ μ‹€μ œ μ•„μ΄ν…œ 인덱슀 1은 cost[1]κ³Ό value[1]이 λ©λ‹ˆλ‹€.

  2. 2차원 λ°°μ—΄ dpλ₯Ό μƒμ„±ν•˜κ³  λͺ¨λ“  μ›μ†Œλ₯Ό 0으둜 μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. dp[i][j]λŠ” i번째 μ•„μ΄ν…œκΉŒμ§€ κ³ λ €ν•˜κ³ , λ°°λ‚­μ˜ μš©λŸ‰μ΄ j일 λ•Œμ˜ μ΅œλŒ€ κ°€μΉ˜λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

  3. μ€‘μ²©λœ λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜μ—¬ dp 배열을 μ±„μ›λ‹ˆλ‹€. iλ₯Ό 1λΆ€ν„° NκΉŒμ§€ μˆœνšŒν•˜λ©° μ•„μ΄ν…œμ„ ν•˜λ‚˜μ”© κ³ λ €ν•©λ‹ˆλ‹€. jλ₯Ό 1λΆ€ν„° 100κΉŒμ§€ μˆœνšŒν•˜λ©° λ°°λ‚­μ˜ μš©λŸ‰μ„ κ³ λ €ν•©λ‹ˆλ‹€.

  4. 각각의 (i, j)에 λŒ€ν•΄, 두 가지 경우λ₯Ό λΉ„κ΅ν•©λ‹ˆλ‹€:

    1. 경우 1: cost[i] (i번째 μ•„μ΄ν…œμ˜ 무게)κ°€ j보닀 μž‘κ±°λ‚˜ 같을 λ•Œ, μ•„μ΄ν…œμ„ 배낭에 넣을 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, dp[i][j]λ₯Ό dp[i-1][j] (i-1번째 μ•„μ΄ν…œμ„ κ³ λ €ν•  λ•Œμ˜ κ°€μΉ˜)와 dp[i-1][j-cost[i]] + value[i] (i번째 μ•„μ΄ν…œμ„ λ„£μ—ˆμ„ λ•Œμ˜ 총 κ°€μΉ˜) μ€‘μ—μ„œ 더 큰 κ°’μœΌλ‘œ κ°±μ‹ ν•©λ‹ˆλ‹€.

    2. 경우 2: cost[i] (i번째 μ•„μ΄ν…œμ˜ 무게)κ°€ j보닀 크면, ν•΄λ‹Ή μ•„μ΄ν…œμ„ 배낭에 넣을 수 μ—†μœΌλ―€λ‘œ dp[i][j]λ₯Ό dp[i-1][j]둜 κ°±μ‹ ν•©λ‹ˆλ‹€.

  5. λͺ¨λ“  μ•„μ΄ν…œκ³Ό λ°°λ‚­ μš©λŸ‰μ— λŒ€ν•΄ 계산을 마치면, dp[N][99]κ°€ λ°°λ‚­μ˜ μ΅œλŒ€ μš©λŸ‰μ΄ 99일 λ•Œ 얻을 수 μžˆλŠ” μ΅œλŒ€ κ°€μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄κ²Œ λ©λ‹ˆλ‹€.

python#

problem_num = 1535
import os, sys

path = os.getcwd() + f"\\txt\\{problem_num}" + ".txt"
sys.stdin = open(path, "r")
input = sys.stdin.readline
n = int(input())
cost = [0] + list(map(int, input().split()))
value = [0] + list(map(int, input().split()))
def happy(n, cost, value):
    dp = [[0 for _ in range(101)] for _ in range(n + 1)]

    for i in range(1, n + 1):
        for j in range(1, 101):
            if cost[i] <= j:
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - cost[i]] + value[i])
            else:
                dp[i][j] = dp[i - 1][j]

    return dp


dp = happy(n, cost, value)
print(dp[n][100 - 1])
135