๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป CS

0-1 Knapsack Problem ์ตœ์ ํ™” (DP ๋ฉ”๋ชจ๋ฆฌ)

by dev.py 2025. 1. 4.

N, K = map(int, input().split())

items = [
	list(map(int, input().split()))
	for i in range(N)
]

# DP ๋ฉ”๋ชจ์ด์ œ์ด์…˜
dp = [ [0] * (K+1) for _ in range(N+1)]

for i in range(1,N+1):
	for w in range(1,K+1):
		weight = items[i-1][0]
		value = items[i-1][1]

		if weight > w:
			dp[i][w] = dp[i-1][w]
		else:
			# ๊ธฐ์กด์— ๋งŒ๋“ค์–ด ๋‘” w-weight ์ตœ๋Œ€๊ฐ’ ๊ฐ€์ ธ ์˜ค๊ณ , ๋น„๊ต
			dp[i][w] = max(dp[i-1][w], dp[i-1][w-weight] + value)


print(dp[N][K])

(N+1) * (K+1) ์‚ฌ์ด์ฆˆ์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•˜์—ฌ ํ’€์—ˆ๋‹ค.

ํ˜น์‹œ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ, ChatGPT์—๊ฒŒ ๋ฌผ์–ด๋ณด๋‹ˆ

 

N, K = map(int, input().split())

items = [
    list(map(int, input().split()))
    for _ in range(N)
]

dp = [0] * (K + 1)  # 1์ฐจ์› DP ๋ฐฐ์—ด

for weight, value in items:
    # ๋ฌด๊ฒŒ๋ฅผ K๋ถ€ํ„ฐ weight๊นŒ์ง€ ๊ฑฐ๊พธ๋กœ ํƒ์ƒ‰ (๊ฐ’์ด ๋ฎ์–ด์“ฐ์ด์ง€ ์•Š๋„๋ก)
    for w in range(K, weight - 1, -1):
        dp[w] = max(dp[w], dp[w - weight] + value)

print(dp[K])

 

1.  ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ•œ ๊ฐ’ ์ค‘ ์“ฐ์ด๋Š” ๊ฑด, ์ง์ „์˜ ๊ฐ’ ๋ฆฌ์ŠคํŠธ์ด๊ณ ,  DP๋ฅผ ๋’ค์—์„œ ๋ถ€ํ„ฐ ๊ฐฑ์‹ ํ•˜๋ฉด ์—…๋ฐ์ดํŠธ์™€ ์กฐํšŒ๊ฐ€ ๊ผฌ์ด์ง€ ์•Š๋Š”๋‹ค.

2. ํ˜„์žฌ ์•„์ดํ…œ์˜ ๋ฌด๊ฒŒ๋ณด๋‹ค (ํ˜„์žฌ) ๊ฐ€๋ฐฉ์šฉ๋Ÿ‰์ด ์ž‘์€๊ฑด ๊ณ ๋ ค ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค = ์•ˆ๋“ค์–ด๊ฐ„๋‹ค.