1+ """
2+ [BOJ]#16987.계란으로계란치기:백트레킹/골드5
3+ https://www.acmicpc.net/problem/16987
4+ """
5+ import sys
6+
7+ #0. 입력 변수 정의 및 초기화 하기
8+ input = sys .stdin .readline
9+ N = int (input ())
10+ eggs = [[] for _ in range (N )]
11+
12+ for i in range (N ):
13+ durability , weight = map (int ,input ().split ())
14+ eggs [i ] = [durability , weight ]
15+
16+ # 1. backtracking 수행하기
17+ max_cnt = 0
18+ def backtracking (idx ,cnt ) :
19+ global max_cnt
20+ print (f"stage { idx } " )
21+ # pruning 조건 : 현재 남은 횟수로 2개씩 깨도 max_cnt 업데이트 불가 경우
22+ if max_cnt >= (cnt + (N - idx )* 2 ):
23+ return 0
24+ #1. 종료 조건 : (1. 모든 계란 선택 완료 n == N)
25+ if idx >= N : # 1개 이하 남아있을떄
26+ max_cnt = max (max_cnt , cnt )
27+ return 0
28+
29+ #1-2. 현재 선택한 계란 (idx) 가 깨져있는 경우
30+ if eggs [idx ][0 ] <= 0 :
31+ backtracking (idx + 1 , cnt )
32+ #2.동작 과정- 계란 깨기
33+ else : # 현재 계란 lived -> 부딫힐 계란 선택 & 부딫치기
34+ flag = False
35+ for j in range (N ) :#현재 계란 부딫칠 계란 선택 (본인idx 아님 or 생존 )
36+ if j != idx and eggs [j ][0 ] > 0 :
37+ # 충돌
38+ eggs [idx ] = eggs [idx ] - eggs [j ][1 ]
39+ eggs [j ] = eggs [j ] - eggs [idx ][1 ]
40+ backtracking (idx + 1 , cnt + int (eggs [idx ][0 ]<= 0 ) + int (eggs [j ][0 ]<= 0 ) ) # 충돌 계산하기
41+ flag = True
42+ # 충돌 원상 복귀
43+ eggs [idx ] = eggs [idx ] + eggs [j ][1 ]
44+ eggs [j ] = eggs [j ] + eggs [idx ][1 ]
45+ # 한 번도 안 깨짐 -> 선택한 idx 내려두고 다음 idx +1 로 이동
46+ if not flag :
47+ backtracking (idx + 1 , cnt )
48+
49+ return 0
50+
51+ backtracking (0 ,0 )
52+ print (max_cnt )
0 commit comments