๐Ÿ‘ป ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๋ƒ…์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜

Choooooยท2023๋…„ 2์›” 15์ผ
0
post-thumbnail

โšฝ ๋ƒ…์ƒ‰(knapsack) ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ƒ…์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์œ ๋ช…ํ•œ dp ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
๋ƒ…์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.
(์ง ์‹ธ๊ธฐ ๋ฌธ์ œ๋Š” dp๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค !!)

  • ์—ฌ๋Ÿฌ ๋ฌผ๊ฑด์ด ์žˆ์„ ๋•Œ ํŠน์ •ํ•œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์กฐํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

Fraction Knapsack
Fraction Knapsack ๋ฌธ์ œ๋Š” ๋ฌผ๊ฑด์˜ ๊ฐ€๊ฒฉ์„ ๋ฌด๊ฒŒ๋กœ ๋‚˜๋ˆ„์–ด ๋ฌด๊ฒŒ ๋Œ€๋น„ ๊ฐ€๊ฒฉ์ด ๋น„์‹ผ ์ˆœ์„œ๋กœ ๋ฌผ๊ฑด์„ ์ •๋ ฌํ•ด์„œ ๋„ฃ์œผ๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
๋‚จ์€ ๋ฐฐ๋‚ญ์ด ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ๋ณด๋‹ค ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ๊ฐ€ ๋งŽ์ด ๋‚˜๊ฐ€๋ฉด ์ž˜๋ผ์„œ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.
= greedy๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ!

0-1 Knapsack
0-1 Knapsack ๋ฌธ์ œ๋Š” ๋ฌผ๊ฑด์„ ์ž๋ฅผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฌผ๊ฑด, ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ, ๋ฌผ๊ฑด์˜ ๊ฐ€๊ฒฉ, ๋ฐฐ๋‚ญ์˜ ๋‚จ์€ ์šฉ๋Ÿ‰์„ ๋ชจ๋‘ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
= dp๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ!

0-1 knapsack

๊ฐ€๋ฐฉ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ์—” ํ•œ๊ณ„๊ฐ€ ์žˆ๊ณ , ๊ฐ ๋ฌผ๊ฑด์—” ๊ฐ€์น˜๊ฐ€ ์ •ํ•ด์ ธ์žˆ๋‹ค.

  • ๊ฐ€๋ฐฉ์— ์ตœ๋Œ€์น˜๋กœ ๋ฌผ๊ฑด์„ ๋‹ด์•˜์„ ๋•Œ, ์ตœ๋Œ€์˜ ๊ฐ€์น˜๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

๐Ÿ˜€ ์–ธ๋œป๋ณด๋ฉด ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋น„์Šทํ•ด(์ตœ์ ์˜ ํ•ด๋ฅผ ๊ตฌํ•˜๊ธฐ) ๋ณด์ด์ง€๋งŒ, ์ตœ์ ์˜ ํ•ด๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์„ ๋•Œ๋„ ์žˆ๋‹ค.

์˜ˆ์‹œ ) ๊ฐ€๋ฐฉ์— 15kg๊นŒ์ง€ ๋‹ด์„ ์ˆ˜ ์žˆ๊ณ , ์„ธ๊ฐ€์ง€ ๋ฌผ๊ฑด์ด ์žˆ๋‹ค. ์ด๋•Œ ๊ฐ€์น˜๋ฅผ ์ตœ๋Œ€๋กœ ๊ฐ€์ง€๋ ค๋ฉด ์–ด๋–ค ๋ฌผ๊ฑด์„ ๋‹ด์•„์•ผํ• ๊นŒ?
[๋ฌผ๊ฑด A] ๊ฐ€์น˜: 10, ๋ฌด๊ฒŒ: 13kg
[๋ฌผ๊ฑด B] ๊ฐ€์น˜: 6, ๋ฌด๊ฒŒ: 6kg
[๋ฌผ๊ฑด C] ๊ฐ€์น˜: 5, ๋ฌด๊ฒŒ: 6kg


๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜
๊ฐ€์น˜๋ฅผ ์ตœ๋Œ€๋กœ ๊ฐ–๋„๋ก ๊ทธ๋•Œ๊ทธ๋•Œ ์ตœ์„ ์˜ ์„ ํƒ์„ ํ•˜๊ธฐ๋•Œ๋ฌธ์— ๋ฌผ๊ฑด A๋ฅผ ๋‹ด๊ณ  ๋์ด ๋‚œ๋‹ค.


์ •๋‹ต
๋ฌผ๊ฑด A๋ฅผ ๋‹ด์ง€ ์•Š๊ณ , B์™€ C๋ฅผ ๋‹ด๋Š”๋‹ค.

์˜คํžˆ๋ ค ํŠน์ • ๋ฌผ๊ฑด์„ ๋‹ด์ง€ ์•Š์•˜์„ ๋•Œ๊ฐ€ ์ตœ์„ ์˜ ์„ ํƒ์ผ ์ˆ˜ ์žˆ์Œ์„ ๊ณ ๋ คํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋ƒ…์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ต์‹ฌ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜

โšฝ ๋ƒ…์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ (DP)๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

x์ถ•์—๋Š” ๊ฐ€๋ฐฉ 1~k๊ฐœ์˜ ๋ฌด๊ฒŒ, y์ถ•์—๋Š” ๋ฌผ๊ฑด์˜ ๊ฐฏ์ˆ˜ n๋งŒํผ์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.
ํ–‰์„ ์ฐจ๋ก€๋Œ€๋กœ ๋Œ๋ฉด์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
ํ•ด ์ค„ ๊ฒƒ์ธ๋ฐ,

  • ํ˜„์žฌ ๋ฌผ๊ฑด(i)์ด ํ•ด๋‹น ์—ด์˜ ๋ฌด๊ฒŒ๋ณด๋‹ค ํฌ๋ฉด, ๋‹ด์„ ์ˆ˜ ์—†๋Š” ๋ฌผ๊ฑด์ด๋ฏ€๋กœ [์ด์ „๋ฌผ๊ฑด][ํ˜„์žฌ๋ฌด๊ฒŒ] (knapsack[i-1][j]) ๊ทธ๋Œ€๋กœ ์ ์šฉํ•ด์ค€๋‹ค.

  • ํ˜„์žฌ ๋ฌผ๊ฑด์ด ํ•ด๋‹น ์—ด์˜ ๋ฌด๊ฒŒ๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ์ž‘์œผ๋ฉด ๋‹ด์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋„ฃ์–ด์คฌ์„ ๋•Œ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ํ˜„์žฌ ๋ฌผ๊ฑด + [์ด์ „๋ฌผ๊ฑด][j-ํ˜„์žฌ๋ฌผ๊ฑด] (weight + knapsack[i-1][j-weight])

  • ์œ„์—์„œ ๊ตฌํ•œ ๋ฌด๊ฒŒ์™€ [์ด์ „๋ฌผ๊ฑด][ํ˜„์žฌ๋ฌด๊ฒŒ]๋ฅผ ๋น„๊ตํ•ด์„œ ๊ทธ ์ค‘ ๋” ํฐ ๊ฐ’์„ ์ฑ„ํƒํ•œ๋‹ค.

  • ๊ฒฐ๊ตญ knapsack[n][k]๋Š” k๋ฌด๊ฒŒ์ผ ๋•Œ ์ตœ๋Œ“๊ฐ’(์ตœ๋Œ€ ๊ฐ€์น˜)์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์ˆ˜์‹

๊ฒฐ๊ตญ ์ˆ˜์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

knapsack[i][j] = max(ํ˜„์žฌ ๋ฌผ๊ฑด ๊ฐ€์น˜ + knapsack[์ด์ „ ๋ฌผ๊ฑด][ํ˜„์žฌ ๊ฐ€๋ฐฉ ๋ฌด๊ฒŒ - ํ˜„์žฌ ๋ฌผ๊ฑด ๋ฌด๊ฒŒ], knapsack[์ด์ „ ๋ฌผ๊ฑด][ํ˜„์žฌ ๊ฐ€๋ฐฉ ๋ฌด๊ฒŒ])

knapsack[i][j] = max(value + knapsack[i - 1][j - weight], knapsack[i - 1][j])

  • ๊ฒฐ๊ตญ ์•„๋ž˜์™€ ๊ฐ™์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

์ด ๋ฌธ์ œ์˜ ์ •๋‹ต์€ dp[N][K]์— ๋“ค์–ด์žˆ๋‹ค.

  • ๊ทธ ์ด์œ ๋Š” 1๋ถ€ํ„ฐ N๊ฐœ์˜ ๋ชจ๋“  ๋ฌผ๊ฑด๋“ค์„ ์‚ดํŽด๋ณด๊ณ , ๋ฐฐ๋‚ญ ์šฉ๋Ÿ‰์ด k์˜€์„ ๋•Œ ์ด ๋ฐฐ๋‚ญ์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๋ฌผ๊ฑด๋“ค์˜ ๊ฐ€์น˜ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋  ๊ฒƒ์ด๊ธฐ ๋–„๋ฌธ์ด๋‹ค.


์ด์ œ dp[i][j]์˜ ์ ํ™”์‹์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” dp[i][j]์˜ ๊ฐ’์„ ์ฐจ๋ก€๋Œ€๋กœ ์ฑ„์›Œ๋‚˜๊ฐ€์•ผ ํ•œ๋‹ค.
dp[i][j]์—๋Š” dp[i-1][j]์™€ dp[i-1][j-w] + v์˜ ๊ฐ’ ์ค‘ ๋” ํฐ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

1) i๊ฐ€ ํ˜„์žฌ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ w๋ณด๋‹ค ์ž‘์„ ๋•Œ

  • ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋‹ด์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ด์ „์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•œ๋‹ค.
    dp[i][j] = dp[i][j-1]

2) i๊ฐ€ ํ˜„์žฌ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ w์™€ ๊ฐ™๊ฑฐ๋‚˜ ํด ๋•Œ

  • ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌผ๊ฑด์„ ๋‹ด์•˜์„ ๋•Œ์™€ ๋‹ด์ง€ ์•Š์•˜์„ ๋•Œ์˜ ๊ฐ€์น˜๋ฅผ ๋น„๊ตํ•ด์ค€ ๋’ค ๋” ํฐ ๊ฐ’์„ ํ• ๋‹นํ•ด์ค€๋‹ค.
  • ํ˜„์žฌ ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜๋Š” v ์ด๋‹ค.
    dp[i][j] = max( dp[i][j-1] , dp[i-w][j-1] + v)

๋ฌผ๊ฑด์„ ๋ฐฐ๋‚ญ์— ๋‹ด์„ ๋•Œ,
1. ํ˜„์žฌ ๋ฐฐ๋‚ญ์˜ ํ—ˆ์šฉ ๋ฌด๊ฒŒ๋ณด๋‹ค ๋„ฃ์„ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ๊ฐ€ ๋” ํฌ๋‹ค๋ฉด ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.
2. ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ ์ค‘ ๋” ๋‚˜์€ ๊ฐ€์น˜๋ฅผ ์„ ํƒํ•œ๋‹ค.

  • -1)ํ˜„์žฌ ๋„ฃ์„ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ๋งŒํผ ๋ฐฐ๋‚ญ์—์„œ ๋บ€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋„ฃ๋Š”๋‹ค.
  • -2)ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋„ฃ์ง€ ์•Š๊ณ  ์ด์ „ ๋ฐฐ๋‚ญ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ๊ฐ„๋‹ค.

์œ„ ๊ณผ์ •์„ ์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด,
ํ˜„์žฌ ๋‹ด์„ ๋ฌผ๊ฑด์˜ ์ธ๋ฑ์Šค๋ฅผ i, ํ˜„์žฌ ๊ฐ€๋ฐฉ ํ—ˆ์šฉ ๋ฌด๊ฒŒ๊ฐ€ j, ํ˜„์žฌ ๋‹ด์„ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ weight, ๊ฐ€์น˜ value๋ผ๊ณ  ํ•˜๋ฉด

  1. j < weight: dp[i][j] = dp[i-1][j]
  2. dp[i][j] = max(dp[i-1][j-weight] + value, dp[i-1][j])

2-1 ๊ณผ์ •์—์„œ ํ˜„์žฌ ๋„ฃ์„ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ๋งŒํผ ๋ฐฐ๋‚ญ์—์„œ ๋บ€๋‹ค๊ณ  ํ•œ ๋ถ€๋ถ„์— ์˜๋ฌธ์ ์ด ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  • ํ˜„์žฌ ๋„ฃ์„ ๋ฌด๊ฒŒ์™€ ๋˜‘๊ฐ™์€ ๋ฌด๊ฒŒ์˜ ๋ฌผ๊ฑด์ด ์—†์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋นผ๋Š”๊ฐ€? ๋ฌผ๊ฑด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ชผ๊ฐœ์ง€์ง€ ๋ชปํ•˜๋Š”๋ฐ ?

ํ•˜์ง€๋งŒ ํ˜„์žฌ ๋„ฃ์„ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ๋งŒํผ ๋บ€ ๋ฐฐ๋‚ญ์—๋Š” ๊ทธ ๋ฌด๊ฒŒ์˜ ๋ฐฐ๋‚ญ์ด ๊ฐ€์ง€๋Š” ์ตœ๋Œ€ ๊ฐ€์น˜๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ƒ๊ด€์—†๋‹ค.

โšฝ ๋ฌผ๊ฑด์˜ ์ตœ๋Œ€ ๊ฐ€์น˜๋Š” dp[๊ฐ€๋ฐฉ ํฌ๊ธฐ][๋ฌผ๊ฑด์˜ ๊ฐœ์ˆ˜]๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค !

์ฝ”๋“œ

import sys

N, K = map(int, input().split())
stuff = [[0,0]]
knapsack = [[0 for _ in range(K + 1)] for _ in range(N + 1)]

for _ in range(N):
    stuff.append(list(map(int, input().split())))


#๋ƒ…์ƒ‰ ๋ฌธ์ œ ํ’€์ด
for i in range(1, N + 1):
    for j in range(1, K + 1):
        weight = stuff[i][0] 
        value = stuff[i][1]
       
        if j < weight:
            knapsack[i][j] = knapsack[i - 1][j] #weight๋ณด๋‹ค ์ž‘์œผ๋ฉด ์œ„์˜ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜จ๋‹ค
        else:
            knapsack[i][j] = max(value + knapsack[i - 1][j - weight], knapsack[i - 1][j])

print(knapsack[N][K])

๐Ÿ‘ป ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ž‘์€ ๋‹จ๊ณ„๋ถ€ํ„ฐ ์˜ฌ๋ผ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์„์ด ํ•œ๊ฐœ๋งŒ ์žˆ์„ ๋•Œ๋ถ€ํ„ฐ ์ฒœ์ฒœํžˆ ์˜ฌ๋ผ๊ฐ€๊ธฐ. ๋ฌธ์ œ๋ฅผ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค !!






์ตœ์ ํ™”

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ dp 1์ฐจ์› ๋ฐฐ์—ด๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. (์ตœ์ ํ™”)
์ด์ œ dp[j]๊ฐ€ ๊ฐ€์ง€๋Š” ๊ฐ’์˜ ์˜๋ฏธ๋ฅผ ์•Œ์•„๋ณด์ž

dp[j] : ๊ฐ€๋ฐฉ์— j๋ผ๋Š” ๋ฌด๊ฒŒ(weight)๊นŒ์ง€(์ตœ๋Œ€ ๋ฌด๊ฒŒ) ๋‹ด์„ ์ˆ˜ ์žˆ์„ ๋•Œ ์ด๋•Œ ์ด ๊ฐ€๋ฐฉ์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ฐ€์น˜(๋ณด์„)๋ฅผ ์˜๋ฏธํ•œ๋‹ค. (j๋Š” ๊ฐ€๋ฐฉ ๋ฌด๊ฒŒ์˜ ํ•œ๊ณ„)

์ด์ œ ์•„์ฃผ ์ž‘์€ ๋‹จ์œ„๋ถ€ํ„ฐ ์ƒ๊ฐํ•ด๋ณด์ž.

  • ๋ณด์„์ด ํ•˜๋‚˜๋งŒ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ ‘๊ทผ

๋ณด์„์˜ ๋ฌด๊ฒŒ, ๊ฐ€์น˜๊ฐ€ 5,12์ผ ๋•Œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด dp[j]์—์„œ j๋Š” 5๋ถ€ํ„ฐ ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

  • ์™œ๋ƒํ•˜๋ฉด j๋Š” ๊ฐ€๋ฐฉ์ด ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฌด๊ฒŒ๋ผ๊ณ  ํ–ˆ์ž–์•„. j๊ฐ€ 5๋ณด๋‹ค ์ž‘์œผ๋ฉด ์• ์ดˆ์— ๋‹ด์„ ์ˆ˜๊ฐ€ ์—†๋‹ค. ์ฆ‰ ๊ฐ€๋ฐฉ์˜ ๋ฌด๊ฒŒ๊ฐ€ j์ด์ƒ์ผ ๋•Œ๋ถ€ํ„ฐ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค. (๋ฌผ๋ก  ๋‹ด๋Š”๋‹ค๋Š” ๊ฐ€์ •.)

dp[j-w] + v ์ฆ‰ ํ˜„์žฌ ๋ณด์„(5,12)๋ฅผ ๋‹ด๋Š”๋‹ค๊ณ  ๊ฐ€์ •์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— -5๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. + ํ˜„์žฌ ๋ณด์„์˜ ๊ฐ€์น˜ 12๋ฅผ ๋”ํ•ด์ค€๋‹ค. (๋‹ด๋Š”๋‹ค๊ณ  ๊ฐ€์ •์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ !)

ํ•œ์นธ ๋” ๊ฐ€์„œ dp[j ==6]์— ๋Œ€ํ•ด์„œ ์ƒ๊ฐํ•ด๋ณด์ž.
(5,12) ๋ณด์„์„ ๋‹ด์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ d[j-w] + 12๋ฅผ ์ ์šฉ๊ฐ€๋Šฅ!

๐Ÿ‘ป ์ด์ œ ๊ฐ€๋ฐฉ์˜ ์ตœ๋Œ€ ๋ฌด๊ฒŒ j == 10์ด ๋  ๋•Œ๊ฐ€ ์ค‘์š”
dp[j-w] + v์ธ๋ฐ dp[5] + 12๋กœ ํ•ด์„๋œ๋‹ค. ๊ทผ๋ฐ ์ด๋ฏธ dp[5]์˜ ๊ฐ’์€ ๊ตฌํ•ด๋†จ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ๊ฐ’๋ณด๋‹ค ์ปค์„œ ๊ฐฑ์‹ ๋œ๋‹ค ! ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ ๋ณด์„๋“ค์„ ํ•˜๋‚˜์”ฉ ์ ์šฉํ•˜๋ฉด์„œ ๊ฐ€๋ฐฉ์˜ ์ตœ๋Œ€ ๋ฌด๊ฒŒ์ผ ๋•Œ์˜ ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ ์ €์žฅํ•ด๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค.

  • ์ด์ œ ๋ณด์„ ํ•˜๋‚˜๋ฅผ ์ ์šฉํ•ด ๋ดค๋‹ค. ๋‹ค๋ฅธ ๋ณด์„์„ ๋‹ด์„ ๋•Œ๋Š” ์ด์ œ ๋น„๊ต๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค.
  • (3,8) ๋ณด์„์„ ๋˜ ์ ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

ํ•ด๋‹น ๋ณด์„์€ j == 3 ์ผ ๋•Œ๋ถ€ํ„ฐ (๊ฐ€๋ฐฉ์ด ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฌด๊ฒŒ๊ฐ€ 3์ผ ๋•Œ๋ถ€ํ„ฐ) ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทผ๋ฐ ์ด์ œ j == 5์ผ๋•Œ...
dp[5 - 3] + 8์„ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•  ๊ฒƒ์ธ๊ฐ€ ? NO

  • ์ด์œ ๋Š” ํ•ด๋‹น ๊ฐ’์€ 8์ธ๋ฐ, ๊ธฐ์กด์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” dp[5]๋Š” 12๋ฅผ ๊ฐ–๋Š”๋‹ค.
  • ๊ฒฐ๊ตญ ๊ธฐ์กด์— ๊ฐ’์ด ๋” ํฌ๋‹ค๋ฉด (๋น„๊ต๋ฅผ ํ•ด์•ผํ•œ๋‹ค๋Š” ๋œป) ๊ทธ๊ฑธ ์œ ์ง€ํ•˜๋ฉด ๋ผ

๊ฒฐ๊ตญ ๊ธฐ์กด ๊ฐ’๋ณด๋‹ค ๋” ํฐ ๊ฐ€์น˜๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ’์ด ๋‚˜์™€์•ผ ๊ฐฑ์‹ ์ด ๋˜๋Š”๊ฑฐ์•ผ !

๐Ÿ‘ ์ฝ”๋“œ์˜ ๋ณ€ํ™”

import sys
sys.stdin = open("input.text", "rt")
input = sys.stdin.readline
sys.setrecursionlimit(10**6)

data = []
n, limit = map(int, input().split()) #๋ณด์„ ์ข…๋ฅ˜, ๋ฌด๊ฒŒ ํ•œ๊ณ„๊ฐ’
for _ in range(n):
    a,b = map(int, input().split())
    data.append((a,b)) #๋ฌด๊ฒŒ, ๊ฐ€์น˜
data.insert(0,(0,0)) #0๋ฒˆ ์ธ๋ฑ์Šค ์‚ฌ์šฉ์•ˆํ•จ
dp = [[0] * (limit+1) for _ in range(n+1)]

for i in range(1,n+1):
    for j in range(1,limit + 1):
        weight = data[i][0] # ํ˜„์žฌ ๋ฌผ๊ฑด ๋ฌด๊ฒŒ
        value = data[i][1] # ํ˜„์žฌ ๋ฌผ๊ฑด ๊ฐ€์น˜

        if j < weight: #ํ˜„์žฌ ๋ฌผ๊ฑด ๋‹ด์„ ์ˆ˜ ์—†์œผ๋‹ˆ ์ด์ „๊บผ ๊ฐ€์ ธ์™€์•ผํ•จ
            dp[i][j] = dp[i-1][j]
        else: #ํ˜„์žฌ ๋ฌผ๊ฑด ๋‹ด์„ ์ˆ˜ ์žˆ์Œ
            dp[i][j] = max(dp[i-1][j-weight] + value, dp[i-1][j])

print(dp[n][limit])
  • 2์ฐจ์› DP ํ…Œ์ด๋ธ” ์‚ฌ์šฉ

๐Ÿ‘ป ๋ƒ…์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ์ ํ™”

import sys
sys.stdin = open("input.text", "rt")
input = sys.stdin.readline
sys.setrecursionlimit(10**6)

data = []
n, limit = map(int, input().split()) #๋ณด์„ ์ข…๋ฅ˜, ๋ฌด๊ฒŒ ํ•œ๊ณ„๊ฐ’
dp = [0] * (limit + 1)

for i in range(n):
    w,v = map(int, input().split()) #๋ฌด๊ฒŒ, ๊ฐ€์น˜
    for j in range(w , limit + 1): #ํ˜„์žฌ ์ ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌด๊ฒŒ๋ถ€ํ„ฐ ๋Œ์•„์•ผ์ง€
        #์ด๋ ‡๊ฒŒ ์•ˆํ• ๊ฑฐ๋ฉด if๋ฌธ์œผ๋กœ ๋”ฐ๋กœ ์กฐ๊ฑด ๊ฑธ์–ด์•ผํ•ด!
        dp[j] = max(dp[j], dp[j-w] + v)  #ํ˜„์žฌ ๋ณด์„์„ ๊ฐ€๋ฐฉ์— ๋‹ด์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ ๊ฐ’์ด dp[j-w] + v ์ด๋‹ค.

print(dp[limit])
  • 1์ฐจ์› DP ํ…Œ์ด๋ธ” ์‚ฌ์šฉ

dp ํ…Œ์ด๋ธ”์„ 2์ฐจ์›์—์„œ 1์ฐจ์›์œผ๋กœ ์ค„์—ฌ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค !

dp vs ์™„ํƒ(DFS, BFS)

์‹œ๊ฐ„์ดˆ๊ณผ ์•ˆ๋‚  ๊ฒƒ ๊ฐ™์œผ๋ฉด ์™„ํƒ๋„ ์ƒ๊ฐํ•˜์ž.

์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ

ref.๋ƒ…์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜

profile
back-end, ์ง€์† ์„ฑ์žฅ ๊ฐ€๋Šฅํ•œ ๊ฐœ๋ฐœ์ž๋ฅผ ํ–ฅํ•˜์—ฌ

0๊ฐœ์˜ ๋Œ“๊ธ€