์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑํŠธ๋ž˜ํ‚น

[๋ฐฑ์ค€ 16987 ๐Ÿฅ‡] ๊ณ„๋ž€์œผ๋กœ ๊ณ„๋ž€์น˜๊ธฐ

1eehyunji 2023. 11. 30. 02:34

https://www.acmicpc.net/problem/16987

 

16987๋ฒˆ: ๊ณ„๋ž€์œผ๋กœ ๊ณ„๋ž€์น˜๊ธฐ

์›๋ž˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๊ธฐ๋ณธ ์†Œ์–‘์€ ํŒ”๊ตฝํ˜€ํŽด๊ธฐ๋ฅผ ๋‹จ ํ•œ ๊ฐœ๋„ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•˜์ง€๋งŒ ์ธ๋ฒ”์ด๋Š” 3๋Œ€ 500์„ ๋„˜๊ธฐ๋Š” ๋ช‡ ์•ˆ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ ์ค‘ ํ•œ ๋ช…์ด๋‹ค. ์ธ๋ฒ”์ด๋Š” BOJ์—์„œ ํ‹€๋ฆฐ ์ œ์ถœ์„ ํ•  ๋•Œ๋งˆ๋‹ค ํ„ฑ

www.acmicpc.net

๋ฌธ์ œ

์›๋ž˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๊ธฐ๋ณธ ์†Œ์–‘์€ ํŒ”๊ตฝํ˜€ํŽด๊ธฐ๋ฅผ ๋‹จ ํ•œ ๊ฐœ๋„ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•˜์ง€๋งŒ ์ธ๋ฒ”์ด๋Š” 3๋Œ€ 500์„ ๋„˜๊ธฐ๋Š” ๋ช‡ ์•ˆ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ ์ค‘ ํ•œ ๋ช…์ด๋‹ค. ์ธ๋ฒ”์ด๋Š” BOJ์—์„œ ํ‹€๋ฆฐ ์ œ์ถœ์„ ํ•  ๋•Œ๋งˆ๋‹ค ํ„ฑ๊ฑธ์ด๋ฅผ 5ํšŒ ํ•˜๋Š” ๊ธฐ์ ์˜ ์šด๋™ ๋ฃจํ‹ด์„ ํ†ตํ•ด ๋‡Œ์™€ ๊ทผ์œก์„ ๋™์‹œ์— ๋‹จ๋ จํ•œ๋‹ค. ๊ทผ์œก์„ ๋‹จ๋ จํ•  ๋•Œ ์‹๋‹จ์ด ์ •๋ง๋กœ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•„๋Š” ์ธ๋ฒ”์ด๋Š” ํƒ„์ˆ˜ํ™”๋ฌผ์ด ๋งŽ์€ ๋ฐฅ์ด๋‚˜ ๋นต ๋”ฐ์œ„์˜ ์•„์นจ ์‹์‚ฌ๋ฅผ ๋Œ€์‹ ํ•ด ๋‹จ๋ฐฑ์งˆ์ด ๋งŽ์€ ๊ณ„๋ž€์ฐœ์„ ํ•ด๋จน๋Š”๋‹ค. ๊ณ„๋ž€์ฐœ์„ ๋จน๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ณ„๋ž€์„ ๊นจ์•ผ ํ•˜๋Š”๋ฐ, ์ธ๋ฒ”์ด๋Š” ํž˜์ด ๋„ˆ๋ฌด ๋„˜์น˜๋Š” ๋‚˜๋จธ์ง€ ๋ถ€์—Œ์˜ ๋Œ€๋ฆฌ์„์„ ์ด์šฉํ•ด ๊ณ„๋ž€์„ ๊นจ๋ฉด ๋Š˜ ๊ป๋ฐ๊ธฐ๊ฐ€ ์‚ฐ์‚ฐ์กฐ๊ฐ๋‚˜ ๋’ท์ฒ˜๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ต๊ฒŒ ๋˜๊ณค ํ•œ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๊ณ„๋ž€์„ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ๊นฐ ์ˆ˜ ์žˆ์„๊นŒ ๊ณ ๋ฏผํ•˜๋˜ ์ธ๋ฒ”์ด์—๊ฒŒ ์œ ํ˜„์ด๋Š” ๊ต‰์žฅํžˆ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์„ ์•Œ๋ ค์ฃผ์—ˆ๋‹ค. ๋ฐ”๋กœ ๊ณ„๋ž€์œผ๋กœ ๊ณ„๋ž€์„ ์น˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ณ„๋ž€๋ผ๋ฆฌ ๋ถ€๋”ช์ณ๋ณด๋‹ˆ ๊ป๋ฐ๊ธฐ๊ฐ€ ์•„์ฃผ ์˜ˆ์˜๊ฒŒ ๊ฐˆ๋ผ์ง€๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•œ ์ธ๋ฒ”์ด๋Š” ์•ž์œผ๋กœ ๊ณ„๋ž€์œผ๋กœ ๊ณ„๋ž€์„ ์ณ์„œ ์‹์‚ฌ ์ค€๋น„๋ฅผ ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ์œ ํ˜„์ด๋Š” ๋” ๋‚˜์•„๊ฐ€ ์‹์‚ฌ ์ค€๋น„๋ฅผ ํ•  ๋•Œ์—๋„ ๋‘๋‡Œ๋ฅผ ๋‹จ๋ จํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ํผ์ฆ์„ ์ธ๋ฒ”์ด์—๊ฒŒ ์•Œ๋ ค์ฃผ์—ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์†Œ๊ฐœํ•˜๊ธฐ ์ „, ๊ณ„๋ž€์œผ๋กœ ๊ณ„๋ž€์„ ์น˜๊ฒŒ ๋  ๊ฒฝ์šฐ ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๋Š”์ง€๋ฅผ ๋จผ์ € ์ดํ•ดํ•˜๊ณ  ๊ฐ€์ž. ๊ฐ ๊ณ„๋ž€์—๋Š” ๋‚ด๊ตฌ๋„์™€ ๋ฌด๊ฒŒ๊ฐ€ ์ •ํ•ด์ ธ์žˆ๋‹ค. ๊ณ„๋ž€์œผ๋กœ ๊ณ„๋ž€์„ ์น˜๊ฒŒ ๋˜๋ฉด ๊ฐ ๊ณ„๋ž€์˜ ๋‚ด๊ตฌ๋„๋Š” ์ƒ๋Œ€ ๊ณ„๋ž€์˜ ๋ฌด๊ฒŒ๋งŒํผ ๊นŽ์ด๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ตฌ๋„๊ฐ€ 0 ์ดํ•˜๊ฐ€ ๋˜๋Š” ์ˆœ๊ฐ„ ๊ณ„๋ž€์€ ๊นจ์ง€๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ณ„๋ž€ 1์˜ ๋‚ด๊ตฌ๋„๊ฐ€ 7, ๋ฌด๊ฒŒ๊ฐ€ 5์ด๊ณ  ๊ณ„๋ž€ 2์˜ ๋‚ด๊ตฌ๋„๊ฐ€ 3, ๋ฌด๊ฒŒ๊ฐ€ 4๋ผ๊ณ  ํ•ด๋ณด์ž. ๊ณ„๋ž€ 1์œผ๋กœ ๊ณ„๋ž€ 2๋ฅผ ์น˜๊ฒŒ ๋˜๋ฉด ๊ณ„๋ž€ 1์˜ ๋‚ด๊ตฌ๋„๋Š” 4๋งŒํผ ๊ฐ์†Œํ•ด 3์ด ๋˜๊ณ  ๊ณ„๋ž€ 2์˜ ๋‚ด๊ตฌ๋„๋Š” 5๋งŒํผ ๊ฐ์†Œํ•ด -2๊ฐ€ ๋œ๋‹ค. ์ถฉ๋Œ ๊ฒฐ๊ณผ ๊ณ„๋ž€ 1์€ ์•„์ง ๊นจ์ง€์ง€ ์•Š์•˜๊ณ  ๊ณ„๋ž€ 2๋Š” ๊นจ์กŒ๋‹ค.

์œ ํ˜„์ด๊ฐ€ ์ธ๋ฒ”์ด์—๊ฒŒ ์•Œ๋ ค์ค€ ํผ์ฆ์€ ์ผ๋ ฌ๋กœ ๋†“์—ฌ์žˆ๋Š” ๊ณ„๋ž€์— ๋Œ€ํ•ด ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๋“ค์–ด์„œ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋‹ค๋ฅธ ๊ณ„๋ž€์„ ์ณ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๊ณ„๋ž€์„ ๊นจ๋Š” ๋ฌธ์ œ์˜€๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ๊ณ„๋ž€์„ ์น˜๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ๊ฐ€์žฅ ์™ผ์ชฝ์˜ ๊ณ„๋ž€์„ ๋“ ๋‹ค.
  2. ์†์— ๋“ค๊ณ  ์žˆ๋Š” ๊ณ„๋ž€์œผ๋กœ ๊นจ์ง€์ง€ ์•Š์€ ๋‹ค๋ฅธ ๊ณ„๋ž€ ์ค‘์—์„œ ํ•˜๋‚˜๋ฅผ ์นœ๋‹ค. ๋‹จ, ์†์— ๋“  ๊ณ„๋ž€์ด ๊นจ์กŒ๊ฑฐ๋‚˜ ๊นจ์ง€์ง€ ์•Š์€ ๋‹ค๋ฅธ ๊ณ„๋ž€์ด ์—†์œผ๋ฉด ์น˜์ง€ ์•Š๊ณ  ๋„˜์–ด๊ฐ„๋‹ค. ์ดํ›„ ์†์— ๋“  ๊ณ„๋ž€์„ ์›๋ž˜ ์ž๋ฆฌ์— ๋‚ด๋ ค๋†“๊ณ  3๋ฒˆ ๊ณผ์ •์„ ์ง„ํ–‰ํ•œ๋‹ค.
  3. ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋“  ๊ณ„๋ž€์˜ ํ•œ ์นธ ์˜ค๋ฅธ์ชฝ ๊ณ„๋ž€์„ ์†์— ๋“ค๊ณ  2๋ฒˆ ๊ณผ์ •์„ ๋‹ค์‹œ ์ง„ํ–‰ํ•œ๋‹ค. ๋‹จ, ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋“  ๊ณ„๋ž€์ด ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์œ„์น˜ํ•œ ๊ณ„๋ž€์ผ ๊ฒฝ์šฐ ๊ณ„๋ž€์„ ์น˜๋Š” ๊ณผ์ •์„ ์ข…๋ฃŒํ•œ๋‹ค.

์ด ๊ณผ์ •์„ ํ†ตํ•ด ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๊ณ„๋ž€์„ ๊นจ๋Š” ๊ฒƒ์ด ์•ž์œผ๋กœ ์ธ๋ฒ”์ด๊ฐ€ ๋งค์ผ ์•„์นจ๋งˆ๋‹ค ํ’€๊ฒŒ ๋  ํผ์ฆ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œ ํ˜„์ด๋Š” ์ธ๋ฒ”์ด๊ฐ€ ์ฐพ์€ ๋‹ต์ด ์ •๋‹ต์ด ๋งž๋Š”์ง€ ํ™•์ธํ•ด์ฃผ๋ ค๊ณ  ํ•œ๋‹ค. ์ผ๋ ฌ๋กœ ๋†“์ธ ๊ณ„๋ž€๋“ค์˜ ๋‚ด๊ตฌ๋„์™€ ๋ฌด๊ฒŒ๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ ์ฃผ์–ด์กŒ์„ ๋•Œ ์ตœ๋Œ€ ๋ช‡ ๊ฐœ์˜ ๊ณ„๋ž€์„ ๊นฐ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋งž์ถฐ๋ณด์ž.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๊ณ„๋ž€์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” N(1 ≤ N ≤ 8)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๊ณ„๋ž€์˜ ๋‚ด๊ตฌ๋„์™€ ๋ฌด๊ฒŒ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. i+1๋ฒˆ์งธ ์ค„์—๋Š” ์™ผ์ชฝ์—์„œ i๋ฒˆ์งธ์— ์œ„์น˜ํ•œ ๊ณ„๋ž€์˜ ๋‚ด๊ตฌ๋„ Si(1 ≤ Si ≤ 300)์™€ ๋ฌด๊ฒŒ Wi(1 ≤ Wi ≤ 300)๊ฐ€ ํ•œ ์นธ์˜ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ธ๋ฒ”์ด๊ฐ€ ๊นฐ ์ˆ˜ ์žˆ๋Š” ๊ณ„๋ž€์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

๋ฌธ์ œ ํ’€์ด

  • ์ด ๋ฌธ์ œ๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ด์šฉํ•ด์„œ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๊ณ„๋ž€์„ ์„ ํƒํ•˜๊ณ , ๋‹ค๋ฅธ ๊ณ„๋ž€๋“ค ์ค‘์— ๊นฐ ์ˆ˜ ์žˆ๋Š” ๊ณ„๋ž€๋“ค์„ ํ•œ ๊ฐœ์”ฉ ๊นฐ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ–ˆ๋‹ค.
  • backtracking_eggs ํ•จ์ˆ˜์— ํ˜„์žฌ ๋“ค๊ณ  ์žˆ๋Š” ๊ณ„๋ž€์˜ ๋ฒˆํ˜ธ num๊ณผ ๊นจ์ง„ ๊ณ„๋ž€์˜ ์ˆ˜ cnt๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ฒจ์„œ ์žฌ๊ท€์ ์œผ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.
    • backtracking_eggs(0,0)์œผ๋กœ ์‹œ์ž‘ํ•ด์„œ 0๋ฒˆ์งธ ๊ณ„๋ž€๋ถ€ํ„ฐ ๊นฐ ์ˆ˜ ์žˆ๋Š” ๊ณ„๋ž€์„ ํƒ์ƒ‰ํ•œ๋‹ค.
    • num๋ฒˆ ๊ณ„๋ž€ ์™ธ์— ๋‹ค๋ฅธ ๊ณ„๋ž€์„ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ํ˜„์žฌ ๊นจ์ง„ ๊ณ„๋ž€์ด ์•„๋‹ˆ๋ผ๋ฉด ๋ถ€๋”ชํžˆ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ณ„๋ž€ ๊ฐ๊ฐ์˜ (์ž์‹ ์˜ ๋‚ด๊ตฌ๋„) - (์ƒ๋Œ€์˜ ๋ฌด๊ฒŒ) ์—ฐ์‚ฐ์„ ํ†ตํ•ด์„œ eggs๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์ฃผ๊ณ , ์ด๋ฒˆ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๊นจ์ง„ ๊ณ„๋ž€์˜ ์ˆ˜๋ฅผ cnt์— ๋ฐ˜์˜ํ•œ ๋’ค์— backtracking_eggs๋กœ ๋‹ค์Œ ๊ณ„๋ž€์„ ๋“œ๋Š” ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
    • ์œ„ ํƒ์ƒ‰์ด ๋๋‚˜๋ฉด (์ž์‹ ์˜ ๋‚ด๊ตฌ๋„) + (์ƒ๋Œ€์˜ ๋ฌด๊ฒŒ) ์—ฐ์‚ฐ์„ ํ†ตํ•ด์„œ ์•ž์„œ ์ˆ˜ํ–‰ํ–ˆ๋˜ ๊ณ„๋ž€์„ ๊นจํŠธ๋ฆฌ๋Š” ์—ฐ์‚ฐ์„ ์›์ƒ๋ณต๊ตฌํ•ด์ฃผ๊ณ , ๋‹ค์Œ ๊ณ„๋ž€์„ ๊นจ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋‹ค์‹œ ํƒ์ƒ‰ํ•ด์ค€๋‹ค.
    • ์œ„ ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ num์ด n์ด ๋˜์–ด ๋งˆ์ง€๋ง‰ ๊ณ„๋ž€๊นŒ์ง€ ๋ชจ๋‘ ํƒ์ƒ‰ํ•ด์ค€ ๊ฒฝ์šฐ answer๋ฅผ cnt๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฐฑ์‹ ํ•œ๋‹ค.
    • ๋˜, num๋ฒˆ ๊ณ„๋ž€์ด ์ด๋ฏธ ๊นจ์ ธ์žˆ๊ฑฐ๋‚˜, ์ž์‹  ์™ธ์— ๋ชจ๋“  ๊ณ„๋ž€์ด ๊นจ์ ธ์žˆ๋Š” ๊ฒฝ์šฐ์—” ๋‹ค์Œ ๊ณ„๋ž€์„ ํƒ์ƒ‰ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด num+1์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ฒจ์„œ ์žฌ๊ท€ ์—ฐ์‚ฐ์„ ์ด์–ด๊ฐ„๋‹ค.
import sys
input=sys.stdin.readline

n=int(input())
eggs=[]
for _ in range(n):
    d,w=map(int, input().split(' '))
    eggs.append([d,w])

answer=-1e9
# num์€ ํ˜„์žฌ ๋“ค๊ณ  ์žˆ๋Š” ๊ณ„๋ž€ ๋ฒˆํ˜ธ
# cnt๋Š” ๊นจ์ง„ ๊ณ„๋ž€ ์ˆ˜
def backtracking_eggs(num, cnt):
    global answer
    if num==n:
        # ๋งˆ์ง€๋ง‰ ๊ณ„๋ž€๊นŒ์ง€ ๋ชจ๋‘ ํƒ์ƒ‰ํ•œ ๊ฒฝ์šฐ
        answer=max(answer, cnt)
        return
    # num๋ฒˆ ๊ณ„๋ž€์ด ์ด๋ฏธ ๊นจ์ ธ์žˆ๋‹ค๋ฉด ๋‹ค์Œ ๊ณ„๋ž€์œผ๋กœ ๋„˜์–ด๊ฐ
    if eggs[num][0] <= 0 or cnt==n-1:
        backtracking_eggs(num+1, cnt)
        return

    for i in range(n):
        if i==num:
            # ํ˜„์žฌ ๋“ค๊ณ  ์žˆ๋Š” ๊ณ„๋ž€์ธ ๊ฒฝ์šฐ ๋„˜์–ด๊ฐ
            continue
        # i๋ฒˆ ๊ณ„๋ž€์ด ํ˜„์žฌ ๊นจ์ง„ ์ƒํƒœ๋ฉด ๋„˜์–ด๊ฐ
        if eggs[i][0]<=0:
            continue
        # num๋ฒˆ ๊ณ„๋ž€๊ณผ i๋ฒˆ ๊ณ„๋ž€ ๋ถ€๋”ชํžˆ๋Š” ๊ฒฝ์šฐ
        tmp=cnt
        eggs[num][0] -= eggs[i][1]
        eggs[i][0] -= eggs[num][1]
        if eggs[num][0]<=0:
            cnt+=1
        if eggs[i][0]<=0:
            cnt+=1
        backtracking_eggs(num+1, cnt)
        eggs[num][0] += eggs[i][1]
        eggs[i][0] += eggs[num][1]
        cnt=tmp


backtracking_eggs(0,0)
print(answer)