본문 바로가기

파이썬 알고리즘 풀이

58)최대점수 구하기(DFS)

문제

이번 정보올림피아드대회에서 좋은 성적을 내기 위하여 현수는 선생님이 주신 N개의 문제를 풀려고 합니다.

 

각 문제는 그것을 풀었을 때 얻는 점수와 푸는데 걸리는 시간이 주어지게 됩니다.

 

제한시간 M안에 N개의 문제 중 최대점수를 얻을 수 있도록 하기

 

조건

해당문제는 해당시간이 걸리면 푸는 걸로 간주한다, 한 유형당 한개만 풀 수 있습니다.

 

제한사항

첫 번째 줄에 문제의 개수N(1<=N<=20)과 제한 시간 M(10<=M<=300)이 주어집니다.

 

두 번째 줄부터 N줄에 걸쳐 문제를 풀었을 때의 점수와 푸는데 걸리는 시간이 주어집니다.

 

첫 번째 줄에 제한 시간안에 얻을 수 있는 최대 점수를 출력합니다.

 

문제풀이

def go(L, tscore, ttime):
  global tmax
  
  if L==N:
    if ttime<=M:
      if tscore>tmax:
        tmax=tscore
  else:
    go(L+1, tscore+pv[L], ttime+pt[L])
    go(L+1, tscore, ttime)

N, M=map(int, input().split())
pv=[]
pt=[]
tmax=-21470000000
for i in range(N):
  a, b=map(int, input().split())
  pv.append(a)
  pt.append(b)

go(0, 0, 0)
print(tmax)