๊ธ€ ์ž‘์„ฑ์ž: ๋˜ฅํด๋ฒ .
๋ฐ˜์‘ํ˜•

์„ค๋ช…


 ๋ฐฐ๋‚ญ ๋ฌธ์ œ(Knapsack Problem)๋Š” ์กฐํ•ฉ ์ตœ์ ํ™”์˜ ์œ ๋ช…ํ•œ ๋ฌธ์ œ๋‹ค.

 

 ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•ด๋ณด์ž. ํ•œ ์—ฌํ–‰๊ฐ€๊ฐ€ ์—ฌํ–‰์„ ๋– ๋‚˜๋ ค๊ณ  ํ•œ๋‹ค. ์—ฌํ–‰๊ฐ€๊ฐ€ ๊ฐ€์ง€๊ณ  ๊ฐ€๋Š” ๋ฐฐ๋‚ญ์—๋Š” ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ์˜ ์ตœ๋Œ“๊ฐ’์ด ์ •ํ•ด์ ธ ์žˆ๊ณ  ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ง์—๋Š” ๊ฐ๊ฐ์˜ ๋ฌด๊ฒŒ(W)์™€ ๊ฐ€์น˜(V)๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๋‹ค.

 

 ์ด ์—ฌํ–‰๊ฐ€๊ฐ€ ๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ๋ฅผ ์ตœ๋Œ€ํ•œ ๊ฝ‰ ์ฑ„์šฐ๋˜ ๊ฐ€์น˜์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋„๋ก ์ง์„ ๊ณ ๋ฅด๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

 

 ์—ฌ๊ธฐ์„œ ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ(๋ฌด๊ฒŒ๊ฐ€ ์†Œ์ˆ˜์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ)์™€ ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

 

  • ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋Š” ๋ถ„ํ•  ๊ฐ€๋Šฅ ๋ฐฐ๋‚ญ ๋ฌธ์ œ(Fractional Knapsack Problem) - ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๋ฐฐ๋‚ญ ๋ฌธ์ œ(Knapsack Problem) - ๋™์  ๊ณ„ํš๋ฒ•(Dynamic Programming)

 

 ์ด ๊ธ€์—์„œ๋Š” ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๋ฐฐ๋‚ญ ๋ฌธ์ œ(Knapsack Problem)๋ฅผ ๋™์  ๊ณ„ํš๋ฒ•(Dynamic Programming)์„ ํ†ตํ•ด ํ’€์–ด๋‚˜๊ฐ€๋Š” ๊ณผ์ •์„ ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•œ๋‹ค.

 

 

 

๋ฌธ์ œ ๋ฐ ํ’€์ด


 ํ•œ ๋‹ฌ ํ›„๋ฉด ๊ตญ๊ฐ€์˜ ๋ถ€๋ฆ„์„ ๋ฐ›๊ฒŒ ๋˜๋Š” ์ค€์„œ๋Š” ์—ฌํ–‰์„ ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค.

์„ธ์ƒ๊ณผ์˜ ๋‹จ์ ˆ์„ ์Šฌํผํ•˜๋ฉฐ ์ตœ๋Œ€ํ•œ ์ฆ๊ธฐ๊ธฐ ์œ„ํ•œ ์—ฌํ–‰์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€์ง€๊ณ  ๋‹ค๋‹ ๋ฐฐ๋‚ญ ๋˜ํ•œ ์ตœ๋Œ€ํ•œ ๊ฐ€์น˜ ์žˆ๊ฒŒ ์‹ธ๋ ค๊ณ  ํ•œ๋‹ค.

 

 ์ค€์„œ๊ฐ€ ์—ฌํ–‰์— ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” N๊ฐœ์˜ ๋ฌผ๊ฑด์ด ์žˆ๋‹ค.

๊ฐ ๋ฌผ๊ฑด์€ ๋ฌด๊ฒŒ W์™€ ๊ฐ€์น˜ V๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ํ•ด๋‹น ๋ฌผ๊ฑด์„ ๋ฐฐ๋‚ญ์— ๋„ฃ์–ด์„œ ๊ฐ€๋ฉด ์ค€์„œ๊ฐ€ V๋งŒํผ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

์•„์ง ํ–‰๊ตฐ์„ ํ•ด๋ณธ ์ ์ด ์—†๋Š” ์ค€์„œ๋Š” ์ตœ๋Œ€ K๋ฌด๊ฒŒ๊นŒ์ง€์˜ ๋ฐฐ๋‚ญ๋งŒ ๋“ค๊ณ  ๋‹ค๋‹ ์ˆ˜ ์žˆ๋‹ค.

์ค€์„œ๊ฐ€ ์ตœ๋Œ€ํ•œ ์ฆ๊ฑฐ์šด ์—ฌํ–‰์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ฑด๋“ค์˜ ๊ฐ€์น˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์•Œ๋ ค์ฃผ์ž.

 

๋ฐฑ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 12865๋ฒˆ ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ ๋ฌธ์ œ
์ถœ์ฒ˜: https://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

 

 ์ค€์„œ๊ฐ€ ์ตœ๋Œ€ ๋ฌด๊ฒŒ ํ—ˆ์šฉ๋Ÿ‰์ด 7์ธ ๋ฐฐ๋‚ญ๊ณผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ง๋“ค์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

  ๋ฌด๊ฒŒ ๊ฐ€์น˜
์ง 1 3 6
์ง 2 4 8
์ง 3 5 12
์ง 4 6 13

 

 ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ๊ฐ์œผ๋กœ๋Š” 

1. ์ง 4๊ฐœ ์ค‘ 1๊ฐœ๋ฅผ ๊ณจ๋ผ ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ ๊ณ„์‚ฐ
2. ์ง 4๊ฐœ ์ค‘ 2๊ฐœ๋ฅผ ๊ณจ๋ผ ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ ๊ณ„์‚ฐ
3. ์ง 4๊ฐœ ์ค‘ 3๊ฐœ๋ฅผ ๊ณจ๋ผ ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ ๊ณ„์‚ฐ
4. ์ง 4๊ฐœ ์ค‘ 4๊ฐœ๋ฅผ ๊ณจ๋ผ ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ ๊ณ„์‚ฐ
5. 1~4 ๊ณผ์ •์—์„œ ๋‚˜์˜จ ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ๋†’์€ ๊ฐ’์ด ์ตœ๋Œ€ ๊ฐ’

์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ฒ ์œผ๋‚˜ ํ•ด๋‹น ๋ฐฉ์‹์€ 

nC0 + nC1 + ... + nC r = 2^n

์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๊ณ  ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

๋”ฐ๋ผ์„œ ์ด์ „์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด ๋‘๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋™์  ๊ณ„ํš๋ฒ•(Dynamic Programming)์„ ์‚ฌ์šฉํ•ด๋ณด์ž.

 

์ง์˜ ๋ฒˆํ˜ธ๋ฅผ i, ๋ฌด๊ฒŒ๋ฅผ  w, ๊ฐ€์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•จ์ˆ˜๋ฅผ Val์ด๋ผ๊ณ  ํ•ด๋ณด์ž.

 

Val(i, w): ~i ๋ฒˆ์งธ๊นŒ์ง€ ์ง์— ๋Œ€ํ•ด ๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ๊ฐ€ w๊นŒ์ง€ ํ—ˆ์šฉ๋์„ ๋•Œ ์ตœ๋Œ€ ๊ฐ€์น˜

 

์ง ๋ฒˆํ˜ธ/๋ฌด๊ฒŒ 1 2 3 4 5 6 7
1 0 0          
2              
3              
4              

 ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ํ‘œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ์ž‘์„ฑํ•ด ๋‚˜๊ฐ€ ๋ณด์ž, [์ง 1]์€ ๋ฌด๊ฒŒ๊ฐ€ 3 ๊ฐ€์น˜๊ฐ€ 6์ด๋‹ค.

[์ง 1]๋งŒ ์ƒ๊ฐํ•ด๋ณธ๋‹ค๋ฉด ๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ๊ฐ€ 2๊นŒ์ง€๋Š” ์•„๋ฌด๊ฒƒ๋„ ์‹ค์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ฐ€์น˜ ํ•ฉ์„ 0์œผ๋กœ ์ ๋Š”๋‹ค.

 

์ง ๋ฒˆํ˜ธ/๋ฌด๊ฒŒ 1 2 3 4 5 6 7
1 0 0 6 6 6 6 6
2              
3              
4              

๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ 3๋ถ€ํ„ฐ๋Š” [์ง 1]์˜ ๋ฌด๊ฒŒ๊ฐ€ 3์ด๋ฏ€๋กœ ์ง 1์„ ์‹ค์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ดํ›„์—๋„ ์ง 1๋งŒ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ๋ชจ๋‘ ๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ๊ฐ€ ๋Š˜์–ด๋‚˜๋„ ์ตœ๋Œ€ ๊ฐ€์น˜๋Š” 6์ด ๋œ๋‹ค.

 

์ง ๋ฒˆํ˜ธ/๋ฌด๊ฒŒ 1 2 3 4 5 6 7
1 0 0 6 6 6 6 6
2 0 0 6 8 8 8 14
3              
4              

 ๋‹ค์Œ์œผ๋กœ [์ง 2]๊นŒ์ง€ ์ƒ๊ฐํ•ด๋ณธ๋‹ค๋ฉด ๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ๊ฐ€ 3๊นŒ์ง€๋Š” [์ง 1]๋ฐ–์— ์‹ค์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์œ„์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ์ ์–ด์ค€๋‹ค.

๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ 4๋ถ€ํ„ฐ๋Š” [์ง 2]๋ฅผ ์‹ค์„ ์ˆ˜ ์žˆ๋‹ค.

[์ง์ด 1๊นŒ์ง€ ์žˆ์—ˆ์„ ๋•Œ, (๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ 4 - ์ง 2์˜ ๋ฌด๊ฒŒ 4)์˜ ๊ฐ€์น˜] + ์ง 2์˜ ๊ฐ€์น˜ = 8
(↑์ง 2๋ฅผ ์ƒˆ๋กœ ๋„ฃ์€ ๊ฒฝ์šฐ)
or
[์ง์ด 1๊นŒ์ง€ ์žˆ์—ˆ์„ ๋•Œ, ๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ 4์˜ ๊ฐ€์น˜ = 6

๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ 4์—์„œ๋Š” ์œ„์™€ ๊ฐ™์ด ๋น„๊ตํ•ด๋ณด๋ฉด 8์˜ ๊ฐ€์น˜๊ฐ€ ๋” ํฌ๋ฏ€๋กœ 8์„ ์ ์–ด์ค€๋‹ค.

 

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ 7์—์„œ๋Š”

[์ง์ด 1๊นŒ์ง€ ์žˆ์—ˆ์„ ๋•Œ, (๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ 7 - ์ง 2์˜ ๋ฌด๊ฒŒ 4)์˜ ๊ฐ€์น˜] + ์ง 2์˜ ๊ฐ€์น˜ = 14
(6 + 8 = 14)
or
[์ง์ด 1๊นŒ์ง€ ์žˆ์—ˆ์„ ๋•Œ, ๋ฐฐ๋‚ญ์˜ ๋ฌด๊ฒŒ 4์˜ ๊ฐ€์น˜ = 6

14๊ฐ€ 6๋ณด๋‹ค ํฌ๋ฏ€๋กœ 14๋ฅผ ์ ์–ด์ค€๋‹ค.

 

 ์ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ‘œ๋ฅผ ์ญ‰ ์ฑ„์›Œ๋‚˜๊ฐ€๋ฉด,

์ง ๋ฒˆํ˜ธ/๋ฌด๊ฒŒ 1 2 3 4 5 6 7
1 0 0 6 6 6 6 6
2 0 0 6 8 8 8 14
3 0 0 6 8 12 12 14
4 0 0 6 8 12 13 14

์™€ ๊ฐ™์€ ํ‘œ๊ฐ€ ์™„์„ฑ๋˜๊ณ  ์ตœ๋Œ€ ๊ฐ€์น˜๋Š” 14๋ผ๋Š” ๊ฒƒ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

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

Val(i, w) = (w >= weight[i]) ? max( Val(i-1,w), Val(i-1,w-weight[i])+value[i] ) : Val(i-1, w)
โ€ป weight[i] = i๋ฒˆ์งธ ์ง์˜ ๋ฌด๊ฒŒ, value[i] = i๋ฒˆ์งธ ์ง์˜ ๊ฐ€์น˜

 

 

๊ด€๋ จ ๋ฌธ์ œ


https://cjwoov.tistory.com/56

 

[C++, Golang] 12865๋ฒˆ: ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ

ํ•ด๋‹น ๊ธ€์˜ ๋‚ด์šฉ์€ ์ตœ์ ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹Œ ๊ธ€์“ด์ด์˜ ์ฃผ๊ด€์ ์ธ ํ’€์ด์ž…๋‹ˆ๋‹ค. ๋” ์ข‹์€ ํ’€์ด๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค(__) ๋งํฌ https://www.acmicpc.net/problem/12865 12865๋ฒˆ: ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ ์ฒซ ์ค„์—

cjwoov.tistory.com

 

๋ฐ˜์‘ํ˜•