# 8007번: 사과 분할 (2^N 부분집합 탐색)
for i in range(1 << n):
curr_sum = 0
for j in range(n):
if (i >> j) & 1:
curr_sum += p[j]
diff = abs(total_sum - 2 * curr_sum)
min_diff = min(min_diff, diff)
# 8008번: 체스판과 퀸
def backtrack(r):
if r == 8:
return 1
ans = 0
for c in range(8):
if board[r][c] == '*' or cols[c] or diag1[r+c] or diag2[r-c+7]:
continue
cols[c] = diag1[r+c] = diag2[r-c+7] = True
ans += backtrack(r + 1)
cols[c] = diag1[r+c] = diag2[r-c+7] = False
return ans
# 8009번: 격자 경로 핵심 가지치기 조건
# 상하 막힘 & 좌우 뚫림 검출
if visited[r-1][c] and visited[r+1][c] and not visited[r][c-1] and not visited[r][c+1]:
return
# 좌우 막힘 & 상하 뚫림 검출
if visited[r][c-1] and visited[r][c+1] and not visited[r-1][c] and not visited[r+1][c]:
return
# 8010번: 모든 디스크 선택 시뮬레이션 루프
while q1 or q2:
if curr_disk == 1:
if not q1:
curr_disk = 2; switches += 1; continue
curr = q1.pop()
for nxt in adj[curr]:
deg[nxt] -= 1
if deg[nxt] == 0:
q1.append(nxt) if nxt <= n1 else q2.append(nxt)
# curr_disk == 2 인 경우도 대칭적으로 동일하게 진행