Data Structures & Algorithms

[Algorithms] 완전탐색(백트랙킹, 상태트리와 CUT EDGE)/깊이우선탐색(DFS) Basic-바둑이 승차(DFS/Cut Edge)

숄구-ml 2022. 5. 24. 14:53

 

  • 이전 문제와 원리는 같으나 시간을 초과하는 경우가 생겨 Cut Edge 방식을 생각해봐야 한다
  • 부분 집합의 o, x 존재 유무를 이진 트리로 표현하고 DFS(idx, sum) 의 방식으로 함수를 생성한다 
  • 시간이 초과되는 경우를 고려하여 트리의 특정 level까지 summation 한 값 + 아직 보지 않은 나머지 level의 원소의 합이 max weight value 보다 작다면 굳이 다음 level의 트리를 검사해 볼 필요가 없으므로 return을 해주는 방식
  • Cut Edge 방식을 사용하면 시간이 현저하게 줄어든다, 역시 알고리즘은 아주 중요해!   

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import sys
# sys.stdin=open("input", "r")
 
def DFS(idx, sum, tsum):
    global max_weight
 
    if max_weight > sum+(total-tsum):   # Cut Edge
        return
 
    if sum > limit:
        return
    if idx == num:
        if sum > max_weight:
            max_weight = sum
    else:
        DFS(idx+1, sum+dogs[idx], tsum+dogs[idx])
        DFS(idx+1, sum, tsum+dogs[idx])
 
if __name__=='__main__':
 
    limit, num = map(int, input().split())
    dogs = list(int(input()) for _ in range(num))
    max_weight = -217000000
    total = sum(dogs)
 
    DFS(000# (list의 인덱스 넘버, sum, tsum)
    print(max_weight)
 
 
cs
728x90