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๋ ๊นจ์ก๋ค.
์ ํ์ด๊ฐ ์ธ๋ฒ์ด์๊ฒ ์๋ ค์ค ํผ์ฆ์ ์ผ๋ ฌ๋ก ๋์ฌ์๋ ๊ณ๋์ ๋ํด ์ผ์ชฝ๋ถํฐ ์ฐจ๋ก๋ก ๋ค์ด์ ํ ๋ฒ์ฉ๋ง ๋ค๋ฅธ ๊ณ๋์ ์ณ ์ต๋ํ ๋ง์ ๊ณ๋์ ๊นจ๋ ๋ฌธ์ ์๋ค. ๊ตฌ์ฒด์ ์ผ๋ก ๊ณ๋์ ์น๋ ๊ณผ์ ์ ์ค๋ช ํ๋ฉด ์๋์ ๊ฐ๋ค.
- ๊ฐ์ฅ ์ผ์ชฝ์ ๊ณ๋์ ๋ ๋ค.
- ์์ ๋ค๊ณ ์๋ ๊ณ๋์ผ๋ก ๊นจ์ง์ง ์์ ๋ค๋ฅธ ๊ณ๋ ์ค์์ ํ๋๋ฅผ ์น๋ค. ๋จ, ์์ ๋ ๊ณ๋์ด ๊นจ์ก๊ฑฐ๋ ๊นจ์ง์ง ์์ ๋ค๋ฅธ ๊ณ๋์ด ์์ผ๋ฉด ์น์ง ์๊ณ ๋์ด๊ฐ๋ค. ์ดํ ์์ ๋ ๊ณ๋์ ์๋ ์๋ฆฌ์ ๋ด๋ ค๋๊ณ 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)
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑํธ๋ํน' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 2800 ๐ฅ] ๊ดํธ ์ ๊ฑฐ (1) | 2023.11.30 |
---|---|
[๋ฐฑ์ค ๋ฐฑํธ๋ํน] N๊ณผ M ์๋ฆฌ์ฆ(1~12) (0) | 2023.11.07 |