스터디/알고리즘스터디-알까기🎯

완전탐색_바둑이 승차_cut edge 방법,DFS 시간초과를 방지하는 법

개발자 덕구🐾 2022. 9. 19. 00:26
728x90

 

if  ans > val + ( total - tsum )  : return

 

전체 합에서 tsum(바둑이를 태웠건 안태웠건 지나간 바둑이의 무게) 을 빼면

앞으로  더할 수 있는 바둑이의 무게가 나온다.

여기서 val을 더한 값이 ans보다 작다면 더 할 필요가 없다. 

끝까지 가도 어차피 ans보다 작기 때문이다. 

 

 

 

dfs에 tsum을 인수로 추가하여 시간 초과를 막는다는 것이 흥미롭다. 

 

 

def dfs(idx,val,tsum) :
    global ans 
    if val > c : return 
    if ans > val + (total-tsum) : return 
    if idx == n : 
        ans = max(ans,val) 
        return 
    else :
        dfs(idx+1,val+arr[idx],tsum+arr[idx])
        dfs(idx+1, val ,tsum+arr[idx])
    
if __name__=="__main__" :
    c,n = map(int,input().split())
    arr = [int(input()) for _ in range(n)]
    total = sum(arr)
    ans = 0
    dfs(0,0,0)
    print(ans)

 

 

 

 

 

반응형