[12865๋ฒˆ] ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ JAVAโ˜•

2022. 5. 8. 05:32ยท๐Ÿ”ฐ ๋ฐฑ์ค€/๋™์ ๊ณ„ํš๋ฒ• 1
728x90

www.acmicpc.net/problem/12865

 

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

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

www.acmicpc.net

์•Œ๊ณ ๋ฆฌ์ฆ˜ [์ ‘๊ทผ ๋ฐฉ๋ฒ•]

์ด ๋ฌธ์ œ๋Š” ๋ฐฐ๋‚ญ ๋ฌธ์ œ(knapsack)๋กœ ๋งค์šฐ ์œ ๋ช…ํ•œ ๋ฌธ์ œ๋‹ค. ๋ฌธ์ œ ์„ค๋ช…์ฒ˜๋Ÿผ ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ“๊ฐ’์ด ์ •ํ•ด์ง€๊ณ  ํ•ด๋‹น ํ•œ๋„ ๋ฌผ๊ฑด์„ ๋„ฃ์–ด ๊ฐ€์น˜์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋„๋ก ๊ณ ๋ฅด๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ์กฐํ•ฉ ์ตœ์ ํ™” ๋ฌธ์ œ๋‹ค.

 

๋ฐฐ๋‚ญ๋ฌธ์ œ, ์ผ๋ช… ๋ƒ…์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋กœ ๋ถ„๋ฅ˜ ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์™€ ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋Š” ๋ฐฐ๋‚ญ๋ฌธ์ œ๋ฅผ Fraction Knapsack Problem ์ด๋ผ ํ•˜๊ณ , ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๋ฐฐ๋‚ญ๋ฌธ์ œ๋ฅผ 0/1 Knapsack Problem ์ด๋ผ ํ•œ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋˜ํ•œ ๋‹ค๋ฅด๊ฒŒ ์ ์šฉํ•˜๋Š”๋ฐ, Fraction Knapsack Problem ์˜ ๊ฒฝ์šฐ ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜(Greedy)์„ ์“ฐ๋ฉฐ, 0/1 Knapsack Problem์˜ ๊ฒฝ์šฐ DP ๋ฒ•์„ ์“ด๋‹ค. (๋ฌผ๋ก  FPTAS(Fully polynomial time approximation scheme) ์œผ๋กœ ์Šค์ผ€์ผ๋ง์„ ํ†ตํ•œ ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ๊ทผ์‚ฌ์น˜๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์ธ์ง€๋ผ ์ž์นซ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค.)

 

์ด๋ฒˆ ๋ฌธ์ œ๋Š” ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(DP)๋กœ ํ•ด๊ฒฐํ•ด์•ผํ•œ๋‹ค.

 

 

์ด์ „์— LCS๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ํ•œ ๋ฒˆ ํ‘œ๋ฅผ ๊ทธ๋ ค๋ณด์ž.

 

๋จผ์ € ๋ฌด๊ฒŒ W[] ๋ฐฐ์—ด๊ณผ ๊ฐ€์น˜ V[] ๋ฐฐ์—ด์ด ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, ๊ฐ W[i] ์˜ ๋ฌด๊ฒŒ์— ๋Œ€์‘๋˜๋Š” ๊ฐ€์น˜๋Š” V[i]๋‹ค. ์ฆ‰, (Wi, Vi) ๋ผ๊ณ  ํ•  ๋•Œ, ์œ„ ์˜ˆ์ œ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

(Wi, Vi) = (6, 13), (4, 8), (3, 6), (5, 12)

๊ทธ๋ฆฌ๊ณ  ๋ฐฐ๋‚ญ์ด ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๋ฌด๊ฒŒ K = 7 ์ด๋‹ค.

 

์ด๋ฅผ ํ† ๋Œ€๋กœ ์ˆ˜์šฉ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๋ฌด๊ฒŒ์— ๋”ฐ๋ฅธ i๊นŒ์ง€์˜ ๊ฐ ๋ฌผํ’ˆ ๋ฐ ๊ฐ€์น˜๋ฅผ ํ‘œ๋กœ ๊ทธ๋ ค๋ณด๋ฉด ๊ทœ์น™์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค. dp(์ˆ˜์šฉ๊ฐ€๋Šฅํ•œ ๋ฌด๊ฒŒ)๋ฅผ 0๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์ฑ„์›Œ๋ณด๋„๋ก ํ•˜์ž. (์ฐธ๊ณ ๋กœ ์„ธ๋กœ์ค„์€ ~๊นŒ์ง€ ํƒ์ƒ‰ํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๋‹ค.)

 

 

 

๋‹น์—ฐํžˆ dp[0] ์€ ์ˆ˜์šฉ๊ฐ€๋Šฅํ•œ ๋ฌด๊ฒŒ๊ฐ€ 0์ด๋ฏ€๋กœ ๋ชจ๋‘ 0์ผ ๊ฒƒ์ด๋‹ค.. 

 

dp[1], dp[2] ๋˜ํ•œ ์ˆ˜์šฉ๊ฐ€๋Šฅํ•œ ๋ฌผ๊ฑด์ด ์—†์œผ๋ฏ€๋กœ ๋ชจ๋‘ 0์œผ๋กœ ์ฑ„์šฐ์ž.

 

 

 

 

 

 

๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ์ด์ œ ์ฑ„์šธ ๊ฒƒ์ด ์ƒ๊ธด๋‹ค. ์ผ๋‹จ dp[3] ์ฆ‰, ๋ฌด๊ฒŒ 3์„ ์ˆ˜์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ i = 3 ์ผ ๋•Œ๋ถ€ํ„ฐ์ด๋‹ค. ์ฆ‰, ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

 

 

์‘? ์™œ i=4 ์ผ ๋•Œ๋„ 6์œผ๋กœ ์ฑ„์›Œ์ง€๋‚˜์š”?  ๋ผ๊ณ  ๋ฌป๋Š”๋‹ค๋ฉด ์•ž์„œ ๋งํ–ˆ์ง€๋งŒ ์„ธ๋กœ์ค„์„ ~๊นŒ์ง€ ํƒ์ƒ‰ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ผ๊ณ  ํ–ˆ๋‹ค. ์ฆ‰, i=3์— ๋Œ€ํ•ด ํƒ์ƒ‰ํ–ˆ๋Š”๋ฐ ๋ฌด๊ฒŒ 3์— ๋Œ€์‘๋˜๋Š” 6์„ ๋‹ด์„ ์ˆ˜ ์žˆ์–ด dp[3]์— ์ €์žฅ๋˜์—ˆ๋‹ค. ๊ทธ ๋‹ค์Œ์— i=4๋ฅผ ํƒ์ƒ‰ํ• ํ…๋ฐ, W[4] = 5 ์ด๋ฏ€๋กœ ๋ฌด๊ฒŒ๊ฐ€ 5๋ผ๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ ์ฑ„์šธ ์ˆ˜ ์—†๊ณ  ์ด์ „ i=3 ์— ๋Œ€ํ•˜์—ฌ ํƒ์ƒ‰ํ•  ๋•Œ์˜ ์ฑ„์›Œ์ง„ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๊ฐ–๊ณ  ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. (๋ˆ„์  ํƒ์ƒ‰์ด๋ผ ํ•˜๋ฉด ์ดํ•ด๊ฐ€ ๋ ๋ ค๋‚˜..)

 

์ผ๋‹จ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฑ„์›Œ๋ณด๋ฉด ์ดํ•ด ๊ฐˆ ๊ฒƒ์ด๋‹ค.

 

๊ทธ ๋‹ค์Œ ์ˆ˜์šฉ๊ฐ€๋Šฅํ•œ ๋ฌด๊ฒŒ๊ฐ€ 4์ผ ๋•Œ์ด๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ i=2 ์ผ ๋•Œ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ํฌ์ธํŠธ ํ•˜๋‚˜.

i = 1๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•  ๋•Œ, i = 1 ์ผ ๋•Œ์—๋Š” (6, 13) ์œผ๋กœ ์ฃผํ™ฉ์ƒ‰ ๋ฐ•์Šค์— ์žˆ๋Š” ์นธ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ํƒ์ƒ‰ํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ๊ฐ’์— ๋Œ€ํ•˜์—ฌ ์ด์ „ i๊ฐ’์— ๋Œ€ํ•œ dp์— ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋˜์–ด์žˆ๋Š” ๊ฐ’์„ ๊ฐ–๊ณ ์™€์•ผํ•œ๋‹ค.

 

ํ˜„์žฌ ์ˆ˜์šฉ๊ฐ€๋Šฅํ•œ ๋ฌด๊ฒŒ๊ฐ€ 4๋ผ๋ฉด i ํƒ์ƒ‰ ์ „์— ๋จผ์ € ์ด์ „ i์— ๋Œ€ํ•œ ๊ฐ’์„ ๊ฐ–๊ณ ์™€์•ผํ•˜๋Š”๋ฐ, i = 0์ธ ๊ฒฝ์šฐ๋Š” ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— 0์ด ์ฑ„์›Œ์ง€๋Š” ๊ฒƒ์ด๋‹ค.  ๊ทธ๋ฆฌ๊ณ  ๋‚œ ํ›„, i = 2 ๋ถ€ํ„ฐ๋Š” 8์„ ๋„ฃ๋Š” ๊ฒƒ์ด ์ตœ๋Œ€ ๊ฐ€์น˜์ด๋ฏ€๋กœ 8์ด ์ฐจ์ง€ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

 

 

 

๋‹ค์Œ ์ค„๋„ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฑ„์šด๋‹ค.

 

 

 

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ i = 1, 2, 3๋ฒˆ์งธ ์—ด์—์„œ๋Š” ์ด์ „ ๋ฌด๊ฒŒ์˜ ๊ฐ’์„ ๊ฐ–๊ณ ์žˆ๊ฒŒ ๋  ๊ฒƒ์ด๊ณ , i = 4 ์ผ ๋•Œ ์ƒˆ๋กœ์šด ๊ฐ’์ด ๋„ฃ์–ด์งˆ ๊ฒƒ์ด๋‹ค.

 

 

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ,,,

 

 

 

 

 

๊ทธ๋ฆฌ๊ณ  7๋ฒˆ์งธ๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค. ์‚ฌ์‹ค ์ด์ „๊นŒ์ง€๋Š” ๋‘ ๊ฐœ ์ด์ƒ์˜ ์กฐํ•ฉ์œผ๋กœ๋Š” ๊ตฌ์„ฑํ•  ์ˆ˜๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ”์ง€๋งŒ, 7๋ถ€ํ„ฐ๋Š” ๋‹ค๋ฅด๋‹ค. ํ•œ ๋ฒˆ ๋ณด๋„๋ก ํ•˜์ž.

 

 

๋จผ์ € ์ด์ „ ๊ณผ์ •๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด์ „์˜ i๊ฐ’์— ๋Œ€ํ•˜์—ฌ ๊ฐ’์„ ๊ฐ–๊ณ ์˜จ๋‹ค. ๋‹ค๋งŒ, i = 0 ์ผ ๋•Œ๋Š” ์ฃผ์–ด์ง„ ๋ฐฐ์—ด ๋ฒ”์œ„ ๋ฐ–์ด๊ธฐ ๋•Œ๋ฌธ์— 0์ด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  i=1 ์ผ ๋•Œ ํƒ์ƒ‰์„ ํ•ด๋ณด์ž. (W1, V1) ์€ (6, 13)์ด์—ˆ๋‹ค. ๊ทธ๋Ÿผ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌด๊ฒŒ๊ฐ€ 7์ธ ๋ฌผ๊ฑด ๋˜๋Š” (๋ฌด๊ฒŒ๊ฐ€ 6์ธ ๋ฌผ๊ฑด + ๋ฌด๊ฒŒ๊ฐ€ 1์ธ ๋ฌผ๊ฑด) ์˜ ์กฐํ•ฉ์„ ๊ฐ–์„ ์ˆ˜ ์žˆ๋‹ค.

 

์ฆ‰, dp[7 - W[1]] ์ธ dp[1]์˜ ์ด์ „ i๊ฐ’(i=0) ์— ๋Œ€ํ•œ ๊ฐ’ + W[1]์˜ ๊ฐ€์น˜ = 13๊ณผ dp[7]i=0 = 0์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, 13์ด 0๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— 13์ด ์ €์žฅ๋œ๋‹ค.

 

ํ•œ๋งˆ๋””๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๋ฌด๊ฒŒ๊ฐ€ 6์ธ ๋ฌผ๊ฑด(๊ฐ€์น˜=13)๊ณผ ๋ฌด๊ฒŒ๊ฐ€ 1(๊ฐ€์น˜=์กด์žฌX)์ธ ๊ฐ€์น˜์˜ ํ•ฉ๊ณผ

๋ฌด๊ฒŒ๊ฐ€ 0์ธ ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

๋‹ค์Œ i = 2์ผ ๋•Œ์ด๋‹ค.

 

 

 

i = 2 ๋Š” (4, 8) ์ด๋‹ค. ์ผ๋‹จ ์ด์ „ i๊ฐ’์ธ 13์„ ๊ฐ–๊ณ ์˜จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  (7 - W[2]) ๋ฌด๊ฒŒ์— ๋Œ€ํ•œ ์ด์ „ i๊ฐ’, ์ฆ‰ (7 - 4) = 3์ด๊ณ , 3์ด๋ผ๋Š” ๋ฌด๊ฒŒ์— ๋Œ€์‘๋˜๋Š” i = 1 ์ผ ๋•Œ์˜ ๊ฐ’(๋นจ๊ฐ„์ƒ‰ ๋ฐ•์Šค)์€ 0์ด๋‹ค . ์ด ๋‘˜์„ ํ•ฉํ•˜๋ฉด 8์ด ๋˜๊ณ , 8๊ณผ 13 ์ค‘ ์ตœ๋Œ“๊ฐ’์€ 13์ด๋ฏ€๋กœ 13์ด ์ €์žฅ๋œ๋‹ค.

 

 

 

 

i = 3 ์ผ ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ๋จผ์ € ์ด์ „ dp[7] ์ผ ๋•Œ์˜ i=2์˜ ๊ฐ’ 13์„ ๊ฐ–๊ณ ์˜จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์กฐํ•ฉ๋ฐฉ๋ฒ•์„ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ i = 3 ์€ (3, 6)์ด๊ณ  ๊ฐ€์น˜๋Š” 6์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  (7 - W[3]) = (7 - 3) = 4์ด๊ณ  4์— ๋Œ€์‘๋˜๋Š” i = 2์˜ ๊ฐ€์น˜๋Š” ๊ฐ€์น˜๋Š” 8์ด๋‹ค. ์ฆ‰, 6 + 8 = 14๊ฐ€ ๋˜๊ณ , ์ด์ „ i๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’์ด๋ฏ€๋กœ ์ตœ๋Œ“๊ฐ’ 14๊ฐ€ ์ €์žฅ๋œ๋‹ค. ์ฆ‰, ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

 

 

๊ทธ ๋‹ค์Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ์ด์ „ ํƒ์ƒ‰ ๊ฐ’ 14(dp[7]i=3) ๊ณผ (7 - W[4]) = 2i=3 ๊ฐ’์ธ 0๊ณผ V[4] ์ธ 12์˜ ํ•ฉ 12๋ฅผ ๋น„๊ตํ•˜๋ฉด 14๊ฐ€ ํฌ๋ฏ€๋กœ 14๊ฐ€ ์ €์žฅ๋œ๋‹ค.

 

 

 

i = 4 ์ผ ๋•Œ ๊ฐ€์น˜๋Š” (5, 12) ๋กœ 12 ์ด๊ณ , (7 - W[5]) = 2๋กœ, 2์— ๋Œ€์‘ํ•˜๋Š” ๋ฌด๊ฒŒ๋Š” 0์ด๋‹ค. ์ฆ‰ ํ•ฉ์€ 12์ด์ธ๋ฐ, ์ด์ „ ๊ฐ’ 14 ๋ณด๋‹ค ์ž‘๊ธฐ ๋•Œ๋ฌธ์— 12๊ฐ€ ์•„๋‹Œ 14๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

์ด๋Ÿฌํ•œ ๋‘ ๊ฐ€์ง€ ์›๋ฆฌ๋กœ ์ ํ™”์‹์„ ๋งŒ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

 

f ๋Š” ํ•จ์ˆ˜ f, k๋Š” ์œ„ ํ‘œ์—์„œ dp, W๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ฌด๊ฒŒ, V๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๊ฐ€์น˜์ด๋‹ค.

 

์ด๋ฅผ ํ† ๋Œ€๋กœ ์žฌ๊ท€๋ฌธ(Top-Down ๋ฐฉ์‹)์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

static int knapsack(int i, int k) {
	// i๊ฐ€ 0๋ฏธ๋งŒ, ์ฆ‰ ๋ฒ”์œ„ ๋ฐ–์ด ๋œ๋‹ค๋ฉด
	if (i < 0)
		return 0;
		
	// ํƒ์ƒ‰ํ•˜์ง€ ์•Š์€ ์œ„์น˜๋ผ๋ฉด?
	if (dp[i][k] == null) {
			
		// ํ˜„์žฌ ๋ฌผ๊ฑด(i)์„ ์ถ”๊ฐ€๋กœ ๋ชป๋‹ด๋Š” ๊ฒฝ์šฐ (์ด์ „ i๊ฐ’ ํƒ์ƒ‰) 
		if(W[i] > k) {
			dp[i][k] = knapsack(i - 1, k);
		}
		// ํ˜„์žฌ ๋ฌผ๊ฑด(i)์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ 
		else if (W[i] <= k) {
			// ์ด์ „ i๊ฐ’๊ณผ ์ด์ „ i๊ฐ’์— ๋Œ€ํ•œ k-W[i]์˜ ๊ฐ’ + ํ˜„์žฌ ๊ฐ€์น˜(V[i])์ค‘ ํฐ ๊ฐ’์„ ์ €์žฅ  
			dp[i][k] = Math.max(knapsack(i - 1, k), knapsack(i - 1, k - W[i]) + V[i]);
		}
	}
	return dp[i][k];
}

W์™€ V ๋ฐฐ์—ด์€ N๊ธธ์ด๋กœ ์ธ๋ฑ์Šค๊ฐ€ 0 ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ i=0์ผ ๋•Œ๋ฅผ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•˜์—ฌ i < 0์œผ๋กœ ๊ณ ์ณ์ค€๋‹ค. ๋˜ํ•œ f(i - 1, k) ์˜ ๊ฒฝ์šฐ ๊ฒฐ๊ตญ ์ตœ์†Œํ•œ ํ•œ ๋ฒˆ์€ ํƒ์ƒ‰ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ ์ œ์ ์œผ๋กœ ์ด์ „ i๊ฐ’์— ๋Œ€ํ•˜์—ฌ ์žฌ๊ท€ํƒ์ƒ‰์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ดํ•ดํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ else if() ๋ฅผ ์ผ์ง€๋งŒ, ๊ทธ๋Ÿฌ์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ else{} ๋กœ ๋ฐ”๊ฟ”์ฃผ์–ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

 

 

 

์ด๋ฅผ ์—ญ์œผ๋กœ Bottom-Up ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

for (int i = 1; i <= N; i++) {
	for (int j = 1; j <= K; j++) {
				
		// i๋ฒˆ์งธ ๋ฌด๊ฒŒ๋ฅผ ๋” ๋‹ด์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ 
		if(W[i] > j) {
			dp[i][j] = dp[i - 1][j];
		}
		// i๋ฒˆ์งธ ๋ฌด๊ฒŒ๋ฅผ ๋” ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ 
		else {
			dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - W[i]] + V[i]);
		}
				
	}
}

์ด ๊ฒฝ์šฐ ํ•˜์œ„ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— i-1 ์— ๋Œ€ํ•˜์—ฌ ์ž์นซ ์ธ๋ฑ์Šค ๋ฒ”์œ„ ๋ฐ–์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— W, N ์€ ๊ฐ๊ฐ [N+1] ์‚ฌ์ด์ฆˆ๋กœ ์„ ์–ธํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  Bottom-Up ๋ฐฉ์‹์˜ ํŠน์„ฑ์ƒ ์ž‘์€ ๊ฒƒ๋ถ€ํ„ฐ ๋งž์ถฐ๋‚˜๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— dp๋ฐฐ์—ด์„ 2์ฐจ์›์ด ์•„๋‹ˆ๋ผ 1์ฐจ์›์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์ค‘๋ณตํƒ์ƒ‰์„ ํ”ผํ•ด๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ์–ด๋–ป๊ฒŒ? ์ƒ๊ฐํ•ด๋ณด์ž. ์šฐ๋ฆฌ๊ฐ€ ๊ฐ ํƒ์ƒ‰์˜ ๊ฒฝ์šฐ i๋ฒˆ์งธ ๋ฌผ๊ฑด์— ๋Œ€ํ•˜์—ฌ W[i]์˜ ํ•ฉ์ด K๋ฅผ ๋„˜๊ฒจ์„œ๋Š” ์•ˆ๋œ๋‹ค. ์ด๋Š” ๊ฑฐ๊พธ๋กœ ๋งํ•˜๋ฉด K(์ตœ๋Œ€๋ฌด๊ฒŒ) - ๋ˆ„์ ๋œ W๊ฐ’์ด 0๋ณด๋‹ค ์ปค์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ์ฆ‰, ๋ถˆํ•„์š”ํ•˜๊ฒŒ 1๋ถ€ํ„ฐ K๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ K-W[i] ์— ๋Œ€ํ•˜์—ฌ 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์„ ๋•Œ ๊นŒ์ง€๋งŒ ํƒ์ƒ‰ํ•จ์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ํƒ์ƒ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ , ์ค‘๋ณต ์นด์šดํŠธ ๋˜ํ•œ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

for (int i = 1; i <= N; i++) {
 
	// K๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜์—ฌ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ ํ•œ๊ณ„์น˜๊ฐ€ ๋„˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต 
	for (int j = K; j - W[i] >= 0; j--) {
		dp[j] = Math.max(dp[j], dp[j - W[i]] + value[i]);
	}
}

Bottom-Up ์ฒซ ๋ฒˆ์งธ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๋‹ค. ๋ฐ˜๋ณต๋ฌธ ์กฐ๊ฑด์‹ ์ž์ฒด๋ฅผ j-W[i] >= 0 ์œผ๋กœ ์„ ์–ธํ•ด์ฃผ๋ฉด์„œ i๋ฒˆ์งธ ๋ฌผ๊ฑด์— ๋Œ€ํ•ด ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— ํ•œ์ •ํ•˜์—ฌ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์žฌ๊ท€๋กœ๋Š” ์œ„์™€๊ฐ™์ด ํ•˜๊ธฐ ํž˜๋“ค๋‹ค. Top-Down ๋ฐฉ์‹ ์ž์ฒด๊ฐ€ ํฐ ๊ทธ๋ฆผ์—์„œ ์ž‘์€ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด๋ผ ๋‹ค๋ฅธ ๋‹จ์œ„์—์„œ dp์— ๋Œ€ํ•ด ์ฐธ์กฐ๋ฅผ ํ•  ๋•Œ ์ž์นซ ๋ถˆ์™„์ „ํ•œ dp๊ฐ’์„ ์ฐธ์กฐํ•˜์—ฌ ์—‰๋šฑํ•œ ๊ฐ’์ด ์ตœ๋Œ“๊ฐ’์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ธŒ๋ฃจํŠธํฌ์Šค(Brute Force)๋กœ ํ•ด์•ผํ•˜๋Š”๋ฐ ์ด๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(N2) ์ด ๋˜๊ณ , ์ด ๋ฌธ์ œ์—์„œ๋Š” 100% ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ๋ฐ›๊ฒŒ ๋œ๋‹ค.



ํ’€์ด ๋ฐ ์ฝ”๋“œ

- ๋ฐฉ๋ฒ• 1 : [Top-Down]

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
 
public class Main {
 
	static Integer[][] dp;
	static int[] W; // weight
	static int[] V; // value
 
	public static void main(String[] args) throws IOException {
 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
 
		int N = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());
 
		W = new int[N];
		V = new int[N];
 
		dp = new Integer[N][K + 1];
 
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			W[i] = Integer.parseInt(st.nextToken());
			V[i] = Integer.parseInt(st.nextToken());
		}
 
		System.out.println(knapsack(N - 1, K));
 
	}
 
	static int knapsack(int i, int k) {
		// i๊ฐ€ 0๋ฏธ๋งŒ, ์ฆ‰ ๋ฒ”์œ„ ๋ฐ–์ด ๋œ๋‹ค๋ฉด
		if (i < 0)
			return 0;
		
		// ํƒ์ƒ‰ํ•˜์ง€ ์•Š์€ ์œ„์น˜๋ผ๋ฉด?
		if (dp[i][k] == null) {
			
			// ํ˜„์žฌ ๋ฌผ๊ฑด(i)์„ ์ถ”๊ฐ€๋กœ ๋ชป๋‹ด๋Š” ๊ฒฝ์šฐ (์ด์ „ i๊ฐ’ ํƒ์ƒ‰) 
			if(W[i] > k) {
				dp[i][k] = knapsack(i - 1, k);
			}
			// ํ˜„์žฌ ๋ฌผ๊ฑด(i)์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ 
			else {
				// ์ด์ „ i๊ฐ’๊ณผ ์ด์ „ i๊ฐ’์— ๋Œ€ํ•œ k-W[i]์˜ ๊ฐ’ + ํ˜„์žฌ ๊ฐ€์น˜(V[i])์ค‘ ํฐ ๊ฐ’์„ ์ €์žฅ  
				dp[i][k] = Math.max(knapsack(i - 1, k), knapsack(i - 1, k - W[i]) + V[i]);
			}
		}
		return dp[i][k];
	}
}

- ๋ฐฉ๋ฒ• 2 : [Bottom-Up 1]

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
 
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		
		int N = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());
 
		int[] W = new int[N + 1]; // ๋ฌด๊ฒŒ
		int[] V = new int[N + 1]; // ๊ฐ€์น˜
		int[][] dp = new int[N + 1][K + 1];
 
		for (int i = 1; i <= N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			W[i] = Integer.parseInt(st.nextToken());
			V[i] = Integer.parseInt(st.nextToken());
		}
 
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= K; j++) {
				
				// i๋ฒˆ์งธ ๋ฌด๊ฒŒ๋ฅผ ๋” ๋‹ด์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ 
				if(W[i] > j) {
					dp[i][j] = dp[i - 1][j];
				}
				// i๋ฒˆ์งธ ๋ฌด๊ฒŒ๋ฅผ ๋” ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ 
				else {
					dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - W[i]] + V[i]);
				}
				
			}
		}
		System.out.println(dp[N][K]);
	}
}

- ๋ฐฉ๋ฒ• 3 : [Bottom-Up 2]

 

 

๋‘ ๋ฒˆ์งธ Bottom-Up ๋ฐฉ์‹์ด๋‹ค. ๋ฌด๊ฒŒ๋ฅผ ๋” ๋‹ด์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์กฐ๊ฑด์‚ผ์•„ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— dp[] ๋ฐฐ์—ด์„ 1์ฐจ์›์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ๊ณ  ๋ถˆํ•„์š”ํ•œ ํƒ์ƒ‰์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ๊ฐœ์„ ์— ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
 
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		int N = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());
 
		int[] W = new int[N + 1]; // ๋ฌด๊ฒŒ
		int[] V = new int[N + 1]; // ๊ฐ€์น˜
		int[] dp = new int[K + 1];
 
		for (int i = 1; i <= N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			W[i] = Integer.parseInt(st.nextToken());
			V[i] = Integer.parseInt(st.nextToken());
		}
 
		for (int i = 1; i <= N; i++) {
			
			// K๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜์—ฌ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ ํ•œ๊ณ„์น˜๊ฐ€ ๋„˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต 
			for (int j = K; j - W[i] >= 0; j--) {
				dp[j] = Math.max(dp[j], dp[j - W[i]] + V[i]);
			}
		}
		System.out.println(dp[K]);
	}
}
728x90
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ”ฐ ๋ฐฑ์ค€/๋™์ ๊ณ„ํš๋ฒ• 1' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [1912๋ฒˆ] ์—ฐ์†๋œ ํ•ฉ JAVAโ˜•
  • [9251๋ฒˆ] LCS JAVAโ˜•
  • [2565๋ฒˆ] ์ „๊นƒ์ค„ JAVAโ˜•
  • [11054๋ฒˆ] ๊ฐ€์žฅ ๊ธด ๋ฐ”์ดํ† ๋‹‰ ๋ถ€๋ถ„ ์ˆ˜์—ด JAVAโ˜•
juno1105
juno1105
๊ณต๋ถ€ํ•˜๋Š” ๊ฒธ ํฌํด ๋ธ”๋กœ๊ทธ
  • juno1105
    @juno1105
    juno1105
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (89)
      • ๐Ÿ’ฌ ์ž์œ  (3)
      • ๐Ÿ“– ์–ดํ•™ ๊ณต๋ถ€ (0)
      • ๐Ÿ“” ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ (4)
      • ๐Ÿ›  ํ”„๋กœ๊ทธ๋žจ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ๋ฒ• (1)
      • ๐Ÿ“š ์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (53)
        • ์Šคํƒ (4)
        • ํ (4)
        • ์ •๋ ฌ ๋ฐ ํƒ์ƒ‰ (17)
        • ๋ฆฌ์ŠคํŠธ (5)
        • ํ•ด์‹œ (1)
        • ํŠธ๋ฆฌ (8)
        • ํž™ (2)
        • ๊ทธ๋ž˜ํ”„ (12)
      • ๐Ÿ’ป ์ปดํ“จํ„ฐ ๊ตฌ์กฐ (0)
      • ๐Ÿšฅ ๋…ผ๋ฆฌํšŒ๋กœ (8)
      • ๐Ÿ”ฐ ๋ฐฑ์ค€ (20)
        • ํ, ์Šคํƒ, ๋ฑ (0)
        • DFS ์™€ BFS (3)
        • ๊ทธ๋ฆฌ๋”” (0)
        • ๋™์ ๊ณ„ํš๋ฒ• 1 (16)
        • ๋™์ ๊ณ„ํš๋ฒ• 2 (0)
        • ์ตœ๋‹จ ๊ฒฝ๋กœ (0)
        • ํŠธ๋ฆฌ (0)
        • ๋ฐฑํŠธ๋ž˜ํ‚น (0)
        • ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ (0)
        • ์ง‘ํ•ฉ๊ณผ ๋งต (1)
      • ๐ŸŒˆ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (0)
      • ๐Ÿ“ฑ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ (0)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

    • โœจ์ž๋ฃŒ๊ตฌ์กฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ปค๋ฆฌํ˜๋Ÿผโœจ
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ํ† ์ต 950์ 
    ๊ทธ๋ž˜ํ”„ํƒ์ƒ‰
    ํ† ์ต 900
    ์ตœ๋‹จ๊ฒฝ๋กœ
    ์‹œ๊ฐ„๋ณต์žก๋„
    ์ •๋ ฌ ์ตœ์„ ์˜ ๊ฒฝ์šฐ
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ํ† ์ต 920์ 
    ํ† ์ต 910์ 
    ์ •๋ ฌ
    ํ† ์ต 900์ 
    ์ •๋ ฌ ์ตœ์•…์˜ ๊ฒฝ์šฐ
    ๋น…์˜คํ‘œ๊ธฐ๋ฒ•
    ํ† ์ต
    ํ† ์ต 900์ ๋Œ€
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
juno1105
[12865๋ฒˆ] ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ JAVAโ˜•
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”