Dynamic Programming#

Knapsack problem ์ด๋ผ๋Š” ๋ฐฐ๋‚ญ ์ฑ„์šฐ๊ธฐ ๋ฌธ์ œ๋Š” ์›Œ๋‚™ ์œ ๋ช…ํ•˜๊ณ  DP๋ฅผ ์ฒ˜์Œ ์ ‘ํ•  ๋•Œ ๋Œ€๋ถ€๋ถ„ ์ด๊ฒƒ์œผ๋กœ ์ ‘ํ•˜๊ฒŒ ๋œ๋‹ค.

knapsack problem

๋ฐฐ๋‚ญ์˜ ์ตœ๋Œ€ ์šฉ๋Ÿ‰์€ W์ด๋ฉฐ, ์ด๋ฅผ ์ดˆ๊ณผํ•ด์„œ ๋ณด์„์„ ๋‹ด์œผ๋ฉด ๋ฐฐ๋‚ญ์ด ์ฐข์–ด์ง„๋‹ค.
๊ฐ ๋ณด์„๋“ค์˜ ๋ฌด๊ฒŒ์™€ ๊ฐ€๊ฒฉ์€ ์•Œ๊ณ  ์žˆ๋‹ค.
๋ฐฐ๋‚ญ์ด ์ฐข์–ด์ง€์ง€ ์•Š๋Š” ์„ ์—์„œ ๊ฐ€๊ฒฉ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋„๋ก ๋ณด์„์„ ๋‹ด๋Š” ๋ฐฉ๋ฒ•์„ return ํ•ด๋ผ.

์—ฌ๊ธฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๋ณด์„์„ ์ž๋ฅผ ์ˆ˜ ์žˆ๋Š” fractional knapsack problem๊ณผ ์ž๋ฅผ ์ˆ˜ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š”(๋ฉ์–ด๋ฆฌ๋กœ) 0-1 knapsack problem์ด ์žˆ๋‹ค. ๋™์ ๊ณ„ํš๋ฒ•์€ ํ›„์ž์˜ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

DP๋Š” ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ์ชผ๊ฐœ์„œ(Devide-and-Conquer), ์ด์ „ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด์„œ ๋ฐ˜๋ณต์„ ์ค„์ด๋Š”(Memorization) ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค. ์›Œ๋‚™ ์œ ๋ช…ํ•œ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด๋ฌธ์ œ๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” dp๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

memo = {1:1, 2:1}
def fibo(n):
    # initialize
    if n == 0:
        return 0
    elif n == 1:
        return 1

    # recursive memo
    if n not in memo:
        memo[n] = fibo(n-1) + fibo(n-2)
    return memo[n]

๊ทธ๋ƒฅ memo๋ฅผ ์•ˆํ•ด๋„ ํ’€ ์ˆ˜ ์žˆ๊ธด ํ•˜์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ์žฌ๊ท€์ ์œผ๋กœ ์•ž์˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋’ค์—์„œ ํ™œ์šฉํ•˜๋Š” ๋ฌธ์ œ๋Š” ์ €์žฅ์„ ํ•˜๋ƒ ์•ˆํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ์„œ n์ด ์ปค์งˆ ๊ฒฝ์šฐ์— ์••๋„์ ์œผ๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ค„์–ด๋“ ๋‹ค. ์ด๋Ÿฌํ•œ DP๋ฅผ 0-1 knapsack problem์— ์ ์šฉํ•˜๋ ค๋ฉด ์ตœ์ ์˜ ์›๋ฆฌ(principle of optimality)๊ฐ€ ์„ฑ๋ฆฝํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•œ๋‹ค. ์ตœ์ ์˜ ์›๋ฆฌ๋ž€

Principle of Optimality

์–ด๋–ค ๋ฌธ์ œ์˜ ์ž…๋ ฅ ์‚ฌ๋ก€์˜ ์ตœ์ ํ•ด๊ฐ€ ๊ทธ ์ž…๋ ฅ ์‚ฌ๋ก€๋ฅผ ๋ถ„ํ• ํ•œ ๋ถ€๋ถ„ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ์ตœ์ ํ•ด๋ฅผ ํ•ญ์ƒ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉด, ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•˜์—ฌ ์ตœ์ ์˜ ์›๋ฆฌ๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค.

๊ฒฐ๊ตญ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ๊ฒƒ์€ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋“ค๋กœ ๋‚˜๋ˆ„๊ณ (์ตœ์  ๋ถ€๋ถ„๊ตฌ์กฐ optimal substructures), ํ•˜์œ„ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š”(overlapping subproblems) ๊ฒƒ์ด๋‹ค. DP๊ฐ€ ํšจ๊ณผ์ ์ด๋ผ๋ฉด ํ•ด๋‹น ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜์–ด์•ผ๋งŒ ํ•œ๋‹ค. ์ด ์กฐ๊ฑด์ด ์„ฑ๋ฆฝ๋˜์ง€ ์•Š์œผ๋ฉด ์ ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜, ํšจ์œจ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋น„๊ต#

์žฌ๊ท€ ๋ถ„ํ• ์ •๋ณต(Divide and Conquer)

DP๋Š” ์ค‘๋ณต๋œ ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ ์ค‘๋ณต ๊ณ„์‚ฐ์„ ์ค‘๋ฆฌ๊ธฐ ์œ„ํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ผ์ด์ฆˆํ•œ๋‹ค. ๋ฐ˜๋ฉด, ๋ถ„ํ•  ์ •๋ณต์€ ๋ฌธ์ œ๋ฅผ ๋…๋ฆฝ์ ์ธ ํ•˜์œ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์ณ์„œ ์ „์ฒด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค. ํ•˜์œ„ ๋ฌธ์ œ๋“ค์ด ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ DP < ๋ถ„ํ• ์ •๋ณต์ด๋‹ค. ์ ํ•ฉํ•œ ๋ฌธ์ œ : ํ€ต ์ •๋ ฌ, ๋ณ‘ํ•ฉ ์ •๋ ฌ, ์ด์ง„ ํƒ์ƒ‰. ํ•ด๋‹น ๊ฒฝ์šฐ๋“ค์€ ํ•˜์œ„ ๋ฌธ์ œ๊ฐ€ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”๋‹ค. ๋…๋ฆฝ์ ์ธ ๋ถ€๋ถ„๋ฌธ์ œ๋“ค์€ ๋ถ„ํ• ์ •๋ณต์ด ์ข‹๋‹ค.

ํƒ์š•(Greedy)

ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งค ๋‹จ๊ณ„์—์„œ ์ตœ์„  ์„ ํƒ, ์ด๋Ÿฌํ•œ ๊ณผ์ •์˜ ๊ฒฐ๋ก ์ด ๊ฒฐ๊ตญ ์ตœ์ ํ•ด๋กœ ๋„๋‹ฌํ•œ๋‹ค. ๋ฐ˜๋ฉด DP๋Š” ๋ฌธ์ œ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ•˜์œ„ ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค. ์ ํ•ฉํ•œ ๋ฌธ์ œ : ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ - ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํƒ์š•์  ์ ‘๊ทผ์ด ์œ ํšจํ•˜์ง€๋งŒ, ๊ฐ€์ค‘์น˜๊ฐ€ ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ ํƒ์š•์  ์ ‘๊ทผ์ด ์ตœ์ ํ•ด๋ฅผ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๋•Œ๋ฌธ์— ๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ™์€ DP ๊ธฐ๋ฒ•์ด ํ•„์š”ํ•ด์ง„๋‹ค.

๋ธŒ๋ฃจํŠธํฌ์Šค(Brute Force)

DP๋Š” ์ค‘๋ณต๋œ ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ค„์ด๋Š” ๋ฐ˜๋ฉด, ๋ธŒ๋ฃจํŠธํฌ์Šค๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์‚ฐ๋Ÿ‰์ด ๋‹น์—ฐํžˆ ๋งŽ์•„ ์งˆ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

๋ฐฑํŠธ๋ž˜ํ‚น(Backtracking)

backtracking์€ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๋˜, ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฏธ๋ฆฌ ๋ฐฐ์ œํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ค„์—ฌ์„œ ํƒ์ƒ‰ํ•œ๋‹ค. DP๋Š” ์ฃผ๋กœ ์ƒํƒœ ์ €์žฅ์„ ํ†ตํ•ด ์ค‘๋ณต ๊ณ„์‚ฐ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๋ฐฑํŠธ๋ž˜ํ‚น์€ ๋ถˆํ•„์š”ํ•œ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง€์น˜๊ธฐํ•˜์—ฌ ํšจ์œจ์„ฑ์„ ๋†’์ธ๋‹ค. ์ ํ•ฉํ•œ ๋ฌธ์ œ : ๊ฒฝ๋กœ ํƒ์ƒ‰์—์„œ ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ์–ด, ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒฝ์šฐ ๋ฐฑํŠธ๋ž˜ํ‚น์ด ํšจ๊ณผ์ ์ด๋‹ค. ๋ฐฑํŠธ๋ž˜ํ‚น์€ ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๊ฐ€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. N-Queen, ๋ถ€๋ถ„ ์ง‘ํ•ฉ์˜ ํ•ฉ ๋ฌธ์ œ ๋“ฑ์ด ์žˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜

์ ํ•ฉ ์กฐ๊ฑด

์ฃผ์š” ์ฐจ์ด์ 

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ (DP)

์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ + ์ค‘๋ณต๋œ ๋ถ€๋ถ„ ๋ฌธ์ œ

์ค‘๋ณต ๊ณ„์‚ฐ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ด์ „ ๊ณ„์‚ฐ์„ ์ €์žฅ.

๋ถ„ํ•  ์ •๋ณต (Divide and Conquer)

๋…๋ฆฝ๋œ ํ•˜์œ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ

์ค‘๋ณต๋œ ๊ณ„์‚ฐ์ด ์—†๊ณ  ๊ฐ ํ•˜์œ„ ๋ฌธ์ œ๊ฐ€ ๋…๋ฆฝ์ ์ด๋ฉด ์ ํ•ฉ. DP๋ณด๋‹ค ๊ฐ„๋‹จ.

ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Greedy)

๊ฐ ๋‹จ๊ณ„์˜ ์ตœ์„  ์„ ํƒ์ด ์ „์ฒด ์ตœ์ ํ•ด๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ

๋งค ๋‹จ๊ณ„ ์ตœ์  ์„ ํƒ๋งŒ ํ•จ. ์ตœ์ ํ•ด ๋ณด์žฅ์ด ํ•„์š”ํ•˜๋ฉด DP๊ฐ€ ๋” ์ ํ•ฉ.

๋ธŒ๋ฃจํŠธํฌ์Šค (Brute Force)

๋ฌธ์ œ์˜ ๊ทœ๋ชจ๊ฐ€ ์ž‘์•„ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ

๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰. ์ค‘๋ณต ๊ณ„์‚ฐ ์ค„์ด๊ธฐ๊ฐ€ ํ•„์š”ํ•˜๋ฉด DP.

๋ฐฑํŠธ๋ž˜ํ‚น (Backtracking)

์กฐ๊ฑด์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ํƒ์ƒ‰ ๊ฐ€์ง€์น˜๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•  ๋•Œ

๊ฐ€์ง€์น˜๊ธฐ ํ™œ์šฉ. DP๋Š” ์ƒํƒœ ์ €์žฅ์„ ํ†ตํ•ด ํšจ์œจ์„ฑ ๊ฐœ์„ , ๋ฐฑํŠธ๋ž˜ํ‚น์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฏธ๋ฆฌ ๋ฐฐ์ œ.

A* ์•Œ๊ณ ๋ฆฌ์ฆ˜ (A)*

๊ฒฝ๋กœ ํƒ์ƒ‰์—์„œ ํœด๋ฆฌ์Šคํ‹ฑ์„ ํ†ตํ•ด ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์„ ๋•Œ

๋น„์šฉ๊ณผ ํœด๋ฆฌ์Šคํ‹ฑ์„ ๋ชจ๋‘ ๊ณ ๋ คํ•ด ํŠน์ • ๋ฐฉํ–ฅ ํƒ์ƒ‰. DP๋Š” ๋ชจ๋“  ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ๊ณ ๋ คํ•ด ์ตœ์ ํ™”.

๋ฐฉ๋ฒ•๋ก #

ํ•ด๋‹น ๋ฐฉ๋ฒ•์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์—๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ํ•˜๋‚˜๋Š” ํƒ‘๋‹ค์šด ๋ฐฉ์‹์ด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ฐ”ํ…€์—… ๋ฐฉ์‹์ด๋‹ค.

ํƒ‘๋‹ค์šด

๋ฌธ์ œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ’€๋˜, ๋ฉ”๋ชจ๋ผ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ•์œผ๋กœ ์ €์žฅํ•ด๋‘๊ณ , ๋‹ค์‹œ ๊ณ„์‚ฐํ• ๋•Œ๋Š” ์ €์žฅ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์žฌ๊ท€์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ํ˜ธ์ถœ ์Šคํƒ์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ์ด๋ฉฐ, ๋ฉ”๋ชจ๋ผ์ด์ œ์ด์…˜์„ ํ†ตํ•ด ์ค‘๋ณต ๊ณ„์‚ฐ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

def fibonacci(n, memo={}):
    if n in memo:  # ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜
        return memo[n]
    if n <= 1:  # ๊ธฐ๋ณธ ์กฐ๊ฑด
        return n
    memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo)  # ๋ฉ”๋ชจ์ด์ œ์ด์…˜
    return memo[n]
๋ฐ”ํ…€์—… ๋ฐฉ์‹

์ž‘์€ ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์‚ฌ์šฉํ•ด ์ ์ง„์ ์œผ๋กœ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ํ•˜์œ„ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ ๊ฒฐ๊ณผ๋ฅผ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๊ณ , ์ด๋ฅผ ์ ์ฐจ ์ƒ์œ„ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜์—ฌ ๋‚˜๊ฐ€๋ฉฐ ์ตœ์ข…์ ์œผ๋กœ ์›ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

def fibonacci(n):
    if n <= 1:  # ๊ธฐ๋ณธ ์กฐ๊ฑด
        return n
    dp = [0] * (n + 1)
    dp[1] = 1
    for i in range(2, n + 1):
        dp[i] = dp[i - 1] + dp[i - 2]  # ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๊ณ„์‚ฐ
    return dp[n]

์ตœ์  ๋ถ€๋ถ„์ง‘ํ•ฉ ์„ฑ๋ฆฝ ์•Œ์•„๋ณด๊ธฐ

  • \(A\) : \(n\)๊ฐœ์˜ ๋ณด์„๋“ค ์ค‘ ์ตœ์ ์œผ๋กœ ๊ณ ๋ฅธ ๋ถ€๋ถ„์ง‘ํ•ฉ

  • \(A\)๊ฐ€ \(n\)๋ฒˆ์งธ ๋ณด์„์„ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, \(A\)๋Š” \(n\)๋ฒˆ์งธ ๋ณด์„์„ ๋บ€ ๋‚˜๋จธ์ง€ \(n-1\)๊ฐœ์˜ ๋ณด์„๋“ค ์ค‘์—์„œ ์ตœ์ ์œผ๋กœ ๊ณ ๋ฅธ ๋ถ€๋ถ„์ง‘ํ•ฉ๊ณผ ๊ฐ™์•„. \(\to\) ์ตœ์ ์˜ ์›๋ฆฌ ์ ์šฉ๊ฐ€๋Šฅ

  • \(A\)๊ฐ€ \(n\)๋ฒˆ์งธ ๋ณด์„์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, \(A\)์— ์†ํ•œ ๋ณด์„๋“ค์˜ ์ด ๊ฐ€๊ฒฉ์€ \(n-1\) ๊ฐœ์˜ ๋ณด์„๋“ค ์ค‘์—์„œ ์ตœ์ ์œผ๋กœ ๊ณ ๋ฅธ ๊ฐ€๊ฒฉ์˜ ํ•ฉ์—๋‹ค๊ฐ€ ๋ณด์„ \(n\)์˜ ๊ฐ€๊ฒฉ์„ ๋”ํ•œ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

  • \(P[i,w]\)๋ž€ i๊ฐœ์˜ ๋ณด์„์ด ์žˆ๊ณ  ๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ ํ•œ๋„๊ฐ€ w์ผ๋•Œ ์ตœ์ ์˜ ์ด์ต

\[\begin{split} P[i,w] = \begin{cases} P[i-1,w] &\text{if } w_i > w\\ \max\{v_i+P[i-1,w-w_k],P[i-1,w]\} &\text{else} \end{cases} \end{split}\]

i๋ฒˆ์งธ ๋ณด์„์ด ๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ ํ•œ๋„๋ณด๋‹ค ๋ฌด๊ฑฐ์šฐ๋ฉด ๋„ฃ์„์ˆ˜ ์—†์Œ์œผ๋กœ i๋ฒˆ์งธ ๋ณด์„์„ ๋บ€ i-1๊ฐœ์˜ ๋ณด์„๋“ค์„ ๊ฐ€์ง€๊ณ  ๊ตฌํ•œ ์ „ ๋‹จ๊ณ„์˜ ์ตœ์ ๊ฐ’์„ ์œ ์ง€ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ i๋ฒˆ์งธ ๋ณด์„ใ…‡๋ฅด ์œ„ํ•ด i๋ฒˆ์งธ ๋ณด์„๋งŒํผ์˜ ๋ฌด๊ฒŒ๋ฅผ ๋น„์› ์„ ๋•Œ์˜ ์ตœ์ ๊ฐ’์— i๋ฒˆ์งธ ๋ณด์„์˜ ๊ฐ€๊ฒฉ์„ ๋”ํ•œ ๊ฐ’ or i-1๊ฐœ์˜ ๋ณด์„๋“ค์„ ๊ฐ€์ง€๊ณ  ๊ตฌํ•œ ์ „ ๋‹จ๊ณ„์˜ ์ตœ์ ๊ฐ’์ค‘ max๋ฅผ ์ทจํ•œ๋‹ค.

12865 : ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ#

์•„์ฃผ ํด๋ž˜์‹ํ•˜๊ณ  ๊ทธ๋ƒฅ ๋งจ ์ฒ˜์Œ ๋งŒ๋‚˜๋Š” ๋ฐฐ๋‚ญ ๋ฌธ์ œ๋‹ค. ์ด๋ฆ„์ฒ˜๋Ÿผ ๊ทธ๋ž˜๋„ ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ ๋ฌธ์ œ์ด๋‹ค. ๋‹ค๋ฅธ ๋ฐฐ๋‚ญ ๋ฌธ์ œ ์งฑ๋งŽ์œผ๋‹ˆ๊น ๋ฐฑ์ค€ ๋ฐฐ๋‚ญ๋ฌธ์ œ ๋ฌธ์ œ์ง‘ ์—ฌ๊ธฐ ๋“ค์–ด๊ฐ€์„œ ๊ตฌ๊ฒฝํ•ด๋ณด์ž.

import sys
input = sys.stdin.readline

def knapsack(n,k,items):
    dp = [[0]*(k+1) for _ in range(n+1)]

    for i in range(1,n+1): # ๋ฌผ๊ฑด ๊ฐœ์ˆ˜ ๋Š˜๋ฆฌ๊ธฐ
        w,v = map(int, items[i-1])
        for j in range(1,k+1): # ์ตœ๋Œ€๋ฌด๊ฒŒ ๋Š˜๋ฆฌ๊ธฐ
            if w <= j: # ๋ฌผ๊ฑด๋ฌด๊ฒŒ๊ฐ€ ์—ฌ์œ ์šฉ๋Ÿ‰๋ณด๋‹ค ์ž‘์œผ๋ฉด
                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])

referances#