철수는 그의 바둑이들을 데리고 시장에 가려고 한다. 그런데 그의 트럭은 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 |