https://www.acmicpc.net/problem/19621
서준이는 아빠로부터 N개의 회의와 하나의 회의실을 선물로 받았다. 각 회의는 시작 시간, 끝나는 시간, 회의 인원이 주어지고 한 회의실에서 동시에 두 개 이상의 회의가 진행될 수 없다. 단, 회의는 한번 시작되면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작 시간은 끝나는 시간보다 항상 작다. N개의 회의를 회의실에 효율적으로 배정할 경우 회의를 진행할 수 있는 최대 인원을 구하자.
첫째 줄에 회의의 수 N이 주어진다. 둘째 줄부터 N + 1 줄까지 공백을 사이에 두고 회의의 시작시간, 끝나는 시간, 회의 인원이 주어진다.
첫째 줄에 회의실에서 회의를 진행할 수 있는 최대 인원을 출력한다.
6
10 40 80
30 60 60
50 80 70
70 100 100
90 120 40
110 140 50
230
1번, 4번, 6번 회의를 진행하는 게 최적이다.
그리디 대표 문자인 기본 회의실 배정 문제와 다르게, 최대한 많은 수의 회의를 배정하는 것이 아닌, 총 회의인원수를 많게 하는 것이 목적인 문제입니다.
문제의 조건으로부터 정렬된 상태로 회의가 주어지고, 회의의 앞뒤가 항상 겹치므로 백트래킹으로 문제를 해결합니다.
import sys
input = sys.stdin.readline #입력빠르게받기
def dfs(cnt, sum): #cnt번째 회의에 대해, cnt-1번째 회의까지 인원수합 sum
global ans
if cnt >= meeting_num:
ans = max(ans,sum)
return
dfs(cnt+1, sum) #이 회의 포함 안할 경우
dfs(cnt+2, sum+arr[cnt][2]) #이 회의 포함할 경우
arr=[]
meeting_num = int(input())
for _ in range(meeting_num):
start,end,peole_num = map(int,input().split())
arr.append((start,end,peole_num))
ans = 0 #최대 회의 인원수 저장될 변수
dfs(0,0) #0번째 회의에 대해 살피는데, 그 전까지의 인원수합은 0
print(ans)