[BOJ][๐ŸŸก5][๋ฐฑ์ค€#12865] ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #12865


๋ฌธ์ œ

์ด ๋ฌธ์ œ๋Š” ์•„์ฃผ ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ์— ๊ด€ํ•œ ๋ฌธ์ œ์ด๋‹ค. ํ•œ ๋‹ฌ ํ›„๋ฉด ๊ตญ๊ฐ€์˜ ๋ถ€๋ฆ„์„ ๋ฐ›๊ฒŒ ๋˜๋Š” ์ค€์„œ๋Š” ์—ฌํ–‰์„ ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ์„ธ์ƒ๊ณผ์˜ ๋‹จ์ ˆ์„ ์Šฌํผํ•˜๋ฉฐ ์ตœ๋Œ€ํ•œ ์ฆ๊ธฐ๊ธฐ ์œ„ํ•œ ์—ฌํ–‰์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€์ง€๊ณ  ๋‹ค๋‹ ๋ฐฐ๋‚ญ ๋˜ํ•œ ์ตœ๋Œ€ํ•œ ๊ฐ€์น˜ ์žˆ๊ฒŒ ์‹ธ๋ ค๊ณ  ํ•œ๋‹ค. ์ค€์„œ๊ฐ€ ์—ฌํ–‰์— ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” N๊ฐœ์˜ ๋ฌผ๊ฑด์ด ์žˆ๋‹ค. ๊ฐ ๋ฌผ๊ฑด์€ ๋ฌด๊ฒŒ W์™€ ๊ฐ€์น˜ V๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ํ•ด๋‹น ๋ฌผ๊ฑด์„ ๋ฐฐ๋‚ญ์— ๋„ฃ์–ด์„œ ๊ฐ€๋ฉด ์ค€์„œ๊ฐ€ V๋งŒํผ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์•„์ง ํ–‰๊ตฐ์„ ํ•ด๋ณธ ์ ์ด ์—†๋Š” ์ค€์„œ๋Š” ์ตœ๋Œ€ K๋งŒํผ์˜ ๋ฌด๊ฒŒ๋งŒ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”ย ๋ฐฐ๋‚ญ๋งŒ ๋“ค๊ณ  ๋‹ค๋‹ ์ˆ˜ ์žˆ๋‹ค. ์ค€์„œ๊ฐ€ ์ตœ๋Œ€ํ•œ ์ฆ๊ฑฐ์šด ์—ฌํ–‰์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ฑด๋“ค์˜ ๊ฐ€์น˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์•Œ๋ ค์ฃผ์ž.


์ž…๋ ฅ

์ฒซ ์ค„์— ๋ฌผํ’ˆ์˜ ์ˆ˜ N(1 โ‰ค N โ‰ค 100)๊ณผ ์ค€์„œ๊ฐ€ ๋ฒ„ํ‹ธ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ K(1 โ‰ค K โ‰ค 100,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฑฐ์ณ ๊ฐ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ W(1 โ‰ค W โ‰ค 100,000)์™€ ํ•ด๋‹น ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜ V(0 โ‰ค V โ‰ค 1,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ชจ๋“  ์ˆ˜๋Š” ์ •์ˆ˜์ด๋‹ค.


์ถœ๋ ฅ

ํ•œ ์ค„์— ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ฑด๋“ค์˜ ๊ฐ€์น˜ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ

์ž…๋ ฅ

4 7
6 13
4 8
3 6
5 12


์ถœ๋ ฅ

14


My Sol

import sys
input = sys.stdin.readline
N, K = map(int, input().split())
dp = [[0]*(K+1) for _ in range(N+1)]

for i in range(1, N+1):
    w, v = map(int, input().split())

    for j in range(1, K+1):
        if j >= w:
            dp[i][j] = max(dp[i-1][j], dp[i-1][j-w]+v)
        else:
            dp[i][j] = dp[i-1][j]

print(dp[N][K])

ํ•œ๋‹ฌ์ „์— ์กฐํ•ฉ์„ ํ’€์–ด๋ณด๋ ค๋‹ค๊ฐ€ ์ฒ˜์ฐธํ•˜๊ฒŒ ํŒจ๋ฐฐํ•œ ๋ฌธ์ œ์˜€๋‹ค. DP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ „ํ˜•์ ์ธ ๋ฐฐ๋‚ญ๋ฌธ์ œ์˜€๋‹ค. ์‚ฌ์‹ค ๋‹ค๋ฅธ ์‹ค๋ฒ„ ๋ฌธ์ œ๋ฅผ ํ’€๋ ค๋‹ค๊ฐ€ ๊ฐ์ด ์•ˆ ์™€์„œ ํ’€์ด๋ฅผ ์ฐพ์•„ ๊ณต๋ถ€ํ–ˆ๋Š”๋ฐ, DP๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŠน์ • ๋ฌผ๊ฑด์— ๋Œ€ํ•ด ๋ฐฐ๋‚ญ์— ๋ฌผ๊ฑด์„ ๋” ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค๋ฉด ๋„ฃ์ง€ ์•Š๊ณ , ๋” ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋„ฃ๋Š” ๊ฒฝ์šฐ์™€ ๋„ฃ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ค‘ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•ด ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!


๋ชจ๋ฒ”๋‹ต์•ˆ

์ถœ์ฒ˜

n, k = map(int, input().split())

data =[]
for i in range(n):
    a, b = map(int, input().split())
    data.append((a,b))
    
data.sort()

dp = [0] * (k+1)

for i in range(len(dp)):
    if i >= data[0][0]:
        dp[i] = data[0][1]

for j in range(1, len(data)):
    for i in range(k, data[j][0]-1, -1):
        dp[i] = max(dp[i], dp[i-data[j][0]]+data[j][1])
        
print(dp[-1])

์—ฐ์‚ฐ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๋” ๋น ๋ฅธ ๋ฌธ์ œํ’€์ด๋ฅผ ๋ฐœ๊ฒฌํ•ด์„œ ํ’€์ด๋ฅผ ๋ถ„์„ํ•ด๋ณด๋ ค ํ•œ๋‹ค. ์ด ๋ถ„์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ํŠœํ”Œํ™”ํ•˜์—ฌ sort๋กœ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘์—ˆ๋‹ค. ๋‚˜๋Š” 2์ฐจ์› ๋ฐฐ์—ด์˜ memoization์„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ์ด ๋ถ„์€ ๋ฎ์–ด์”Œ์šฐ๋ฉด์„œ 1์ฐจ์› ๋ฐฐ์—ด์˜ memoization์„ ํ•˜์…จ๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ