PS

[λ°±μ€€] 1535 μ•ˆλ…• with Python

ν˜•μ€€_It's 2022. 1. 10. 18:41
728x90
λ°˜μ‘ν˜•

πŸ“Œ BOJ 1535 μ•ˆλ…•

πŸ’‘ 쑰건

  1. 첫째 쀄에 μ‚¬λžŒμ˜ 수 N(≀ 20).

  2. λ‘˜μ§Έ 쀄에 각각의 μ‚¬λžŒμ—κ²Œ 인사λ₯Ό ν•  λ•Œ, μžƒλŠ” 체λ ₯이 1번 μ‚¬λžŒλΆ€ν„° μˆœμ„œλŒ€λ‘œ μž…λ ₯.

  3. μ…‹μ§Έ μ€„μ—λŠ” 각각의 μ‚¬λžŒμ—κ²Œ 인사λ₯Ό ν•  λ•Œ, μ–»λŠ” 기쁨이 1번 μ‚¬λžŒλΆ€ν„° μˆœμ„œλŒ€λ‘œ μž…λ ₯.

  4. 체λ ₯κ³Ό 기쁨은 100보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜ λ˜λŠ” 0.

  5. 세쀀이가 얻을 수 μžˆλŠ” μ΅œλŒ€ 기쁨을 좜λ ₯.

  6. 브루트포슀 μ•Œκ³ λ¦¬μ¦˜, λ°°λ‚­ μ•Œκ³ λ¦¬μ¦˜ μœ ν˜• 문제

πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

from sys import stdin

n = int(stdin.readline())
stamina_consum = [0] + list(map(int, stdin.readline().split()))
get_pleasure = [0] + list(map(int, stdin.readline().split()))

dp = [[0] * 101 for _ in range(n + 1)]

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

print(dp[n][99])

πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

예제

3
1 21 79
20 30 25

μ‹€ν–‰κ²°κ³Ό

50

⌨️ 문제 풀이

  1. 브루트포슀 μ•Œκ³ λ¦¬μ¦˜ ν˜Ήμ€ 냅색 μ•Œκ³ λ¦¬μ¦˜ 으둜 풀이할 수 μžˆλ‹€.
    λ‚˜λŠ” 냅색 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν–ˆλ‹€.

  2. 인사λ₯Ό ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μŠ€ν…Œλ―Έλ„ˆ μ†Œλͺ¨ν•˜λŠ” 리슀트λ₯Ό stamina_consum 에 [0]에 μ—°κ²°ν•˜μ—¬ μ €μž₯ν•œλ‹€.
    인사λ₯Ό ν•  λ•Œ 얻을 수 μžˆλŠ” 기쁨 리슀트λ₯Ό get_pleasure 에 [0]에 μ—°κ²°ν•˜μ—¬ μ €μž₯ν•œλ‹€.

  3. dp 배열을 λ§Œλ“ λ‹€.

    • 1λͺ…λΆ€ν„° nλͺ…κΉŒμ§€ 인사λ₯Ό ν–ˆμ„ λ•Œ, 얻을 수 μžˆλŠ” μ΅œλŒ€μ˜ 기쁨의 값을 μ €μž₯ν•  λ°°μ—΄.
    • i번째 μ‚¬λžŒμ—κ²Œ 인사λ₯Ό ν•˜κ³ , μŠ€ν…Œλ―Έλ„ˆ μ†Œλͺ¨λŸ‰λ³΄λ‹€ 체λ ₯ jκ°€ 클 λ•Œ 인사λ₯Ό ν•΄μ„œ 얻을 수 μžˆλŠ” 기쁨의 양을 κ³„μ‚°ν•˜μ—¬ dp에 μ €μž₯ν•œλ‹€.
    • 체λ ₯이 1이 기쀀이며, 좜λ ₯ν•  λ•Œ dp[n][100]을 좜λ ₯ν•˜λ©΄ 세쀀이가 인사λ₯Ό ν•˜λ‹€ 죽어버린 κ²½μš°μ΄λ‹ˆ μ˜€λ‹΅μ΄λ‹€. dp[n][99]λ₯Ό 좜λ ₯ν•œλ‹€.
    • λ§Œμ•½ stamina[i] 보닀 체λ ₯ j κ°€ 적을 경우, dp[i][j] λŠ” dp[i-1][j]의 값을 κ°€μ Έλ‹€ λ„£λŠ”λ‹€.
    • 그렇지 μ•Šμ€ κ²½μš°μ—λŠ” dp[i-1][j] 와 dp[i-1][j - stamina_consum[i]] 에 get_pleasure[i] κ°’ 쀑 큰 κ±Έ 집어 λ„£λŠ”λ‹€.

πŸ’Ύ λŠλ‚€μ 

  1. 냅색 μ•Œκ³ λ¦¬μ¦˜μ€ 풀어도 풀어도 ν—·κ°ˆλ¦°λ‹€.
  2. μ•Œκ³ λ¦¬μ¦˜μ„ μ•Œκ³ μ„œ 풀어도 μ–΄λ ΅κ³ , 까먹으면 닡도 μ—†λŠ” 것 κ°™λ‹€.
  3. 냅색 μ•Œκ³ λ¦¬μ¦˜ 문제λ₯Ό μ •λ¦¬ν•΄μ„œ 풀어봐야할 것 κ°™λ‹€.
  4. 문제 풀이 해섀을 μ“°λ©΄μ„œλ„ ν—·κ°ˆλ €μ„œ λ‹€μ‹œ 인터넷을 보고 μ°Ύμ•„μ„œ μ΄ν•΄ν•˜κ³  문제λ₯Ό ν•΄μ„ν•΄μ„œ 썼닀.
λ°˜μ‘ν˜•