n개의 일이 주어질 때 이를 아침과 저녁으로 n/2개씩 나누어 처리한다.
일마다 특성이 다르기 때문에 같이할 때의 업무 강도를 나타내는 업무 간의 상성 Pij가 존재한다.
아침과 저녁의 일의 힘든 정도가 너무 차이가 나면 일하기가 싫어지기 때문에, 아침의 하는 일의 업무 강도와 저녁에 하는 일의 업무 강도의 차이의 최솟값을 구하고자 한다.
아침과 저녁의 업무 강도의 차이의 최솟값을 구하는 프로그램.
(입력 및 선언)
(강도 구하기)
(최솟값 구하기)
(함수 실행 및 최종 값 출력)
n = int(input())
# 상성 리스트 저장
p = []
for _ in range(n):
p.append(list(map(int, input().split())))
# 강도 구하기
def intensity(c):
res = 0
for i in range(n//2):
for j in range(i+1, n//2):
res += p[c[i]][c[j]]
res += p[c[j]][c[i]]
return res
# 최솟값 구하기
def dfs(idx, depth):
global ans
if depth == n//2:
tmp2 = [i for i in range(n) if i not in tmp]
ans = min(ans, abs(intensity(tmp) - intensity(tmp2)))
for i in range(idx+1, n):
tmp.append(i)
dfs(i, depth+1)
tmp.pop()
tmp = [0]
ans = float("INF")
dfs(0, 1)
print(ans)
재귀함수
def 재귀함수(n):
if 정답이면 :
출력 or 저장
else : 정답이 아니면 :
for 모든 자식 노드에 대해서:
if 정답에 유망하다면(답의 가능성이 있으면) :
자식노드로이동
재귀함수(n+1)
부모노드로 이동
백트래킹
def 백트래킹(n):
if 정답이면 :
출력 or 저장
else :
for 모든 자식 노드에 대해 :
if 유망한지확인(m) :
자식노드로 이동
백트래킹(n+1)
부모노드로 이동
def 유망한지확인(m):
if 조건에 안맞으면 :
return False
return True
참고 : https://edder773.tistory.com/75
백트래킹 문제 풀어보기
N-Queen 백준