본문 바로가기

Algorithm/Python

047 - 바둑이 승차(DFS)

철수는 그의 바둑이들을 데리고 시장에 가려고 한다. 그런데 그의 트럭은 C킬로그램 넘게 태 울수가 없다. 철수는 C를 넘지 않으면서 그의 바둑이들을 가장 무겁게 태우고 싶다.
N마리의 바둑이와 각 바둑이의 무게 W가 주어지면, 철수가 트럭에 태울 수 있는 가장 무거운 무게를 구하는 프로그램을 작성하세요.

 

 

입력설명
첫 번째 줄에 자연수 C(1<=C<=100,000,000)와 N(1<=N<=30)이 주어집니다. 둘째 줄부터 N마리 바둑이의 무게가 주어진다.

 

출력설명
첫 번째 줄에 가장 무거운 무게를 출력한다.

 

입력예제 1

259 5
81
58

42

33

61

 

출력예제 1

242

 

 

 

import time
#import sys
#sys.stdin = open('in4.txt', 'rt')


def DFS(L):
    global res, c

    if L == n+1:
        sum = 0
        for i in range(1, n+1):
            if ch[i] == 1:
                sum += a[i-1]
        if sum > c:
            return
        else:
            if res < sum:
                res = sum
                # print('sum: {}, {}'.format(sum, ch))
    else:
        ch[L] = 1
        DFS(L+1)
        ch[L] = 0
        DFS(L+1)


def DFS2(L, sum):
    global res, c

    if sum > c:
        return
    elif L == n:
        if sum > res:
            res = sum
    else:
        DFS2(L+1, sum+a[L])
        DFS2(L+1, sum)


def DFS3(L, sum, tsum):
    global res, c

    # total-tsum 은 현재 레벨 하위의 모든 총합임.
    # 그래서 현재까지의 합 + 하위의 총합(모두 포함한다는 전제하에) < 현재 최대값,
    # 현재 최대값 보다 작으면 무조건 탈락하는 조건추가.
    if sum+(total-tsum) < res:
        return
    elif sum > c:
        return
    elif L == n:
        if sum > res:
            res = sum
    else:
        DFS3(L+1, sum+a[L], tsum+a[L])
        DFS3(L+1, sum, tsum+a[L])


if __name__ == '__main__':
    c, n = map(int, input().split())
    a = [int(input()) for _ in range(n)]
    ch = [0]*(n+1)
    total = sum(a)
    # print(c, n, a, total)
    
# 각 요소의 포함여부를 확인하고 합계를 구하는 방식
    res = 0
    start = time.time()
    DFS(1)
    end = time.time()
    print(f'DFS, {end-start:.6f}')
    print(res)

# 합계를 직접 구하는 방식
    res = 0
    start = time.time()
    DFS2(0, 0)
    end = time.time()
    print(f'DFS2, {end-start:.6f}')
    print(res)

# 합계를 직접 구하는 방식의 보완, 각 레벨기준으로 하위 무게를 모두 더 해도,
# 현재 최대값보다 작다면 의미가 없으므로 바로 return 해서 스킵하는 보완로직 추가
    res = 0
    start = time.time()
    DFS3(0, 0, 0)
    end = time.time()
    print(f'DFS3, {end-start:.6f}')
    print(res)

 

 

 

  • 함수별 연산 속도를 시간으로 비교한 결과, 결과는 같지만 실행 시간이 차이나는 것을 볼 수 있다
 ~ python aa.py
22640
DFS, 4.257046
22640
DFS2, 0.569778
22640
DFS3, 0.000029

 

 

  • 시간 비교용으로 사용한 데이터
더보기

100000000 21
27
567
999
234
50
567
123
4734
754
84
35
1353
76
464
4634
65
89
3553
59
38
4135

 

 

 

 

'Algorithm > Python' 카테고리의 다른 글

049 - 동전교환  (0) 2023.08.28
048 - 중복순열 구하기  (0) 2023.08.28
046 - 합이 같은 부분집합(DFS)  (0) 2023.08.25
045 - 부분집합 구하기(DFS)  (0) 2023.08.25
044 - 이진트리 순회(깊이우선탐색)  (0) 2023.08.25