https://www.acmicpc.net/problem/16493

이 문제는 각 챕터를 선택하여 주어진 일수 내에서 최대 페이지 수를 구하는 문제로, 0/1 배낭 문제(Knapsack Problem)와 유사합니다.
N, M = map(int, input().split())
chapters = [tuple(map(int, input().split())) for _ in range(M)]
dp = [0] * (N + 1)
for days, pages in chapters:
for i in range(N, days - 1, -1):
dp[i] = max(dp[i], dp[i - days] + pages)
print(dp[N])
N과 M을 입력 받습니다.chapters 리스트에 저장합니다.dp 리스트를 크기 N + 1로 생성하고 0으로 초기화합니다.dp[i]는 i일 내에 읽을 수 있는 최대 페이지 수를 의미합니다.days부터 N일까지 역순으로 반복합니다.dp[i]를 현재 값과 dp[i - days] + pages 중 큰 값으로 업데이트합니다.i에서 현재 챕터를 선택했을 때와 선택하지 않았을 때의 최대 페이지 수를 비교합니다.dp[N]을 출력하여 N일 내에 읽을 수 있는 최대 페이지 수를 나타냅니다.M은 챕터의 수로 최대 20입니다.N은 남은 기간으로 최대 200입니다.dp: DP 테이블로 사용되며, 인덱스는 남은 일수를 의미하고 값은 최대 페이지 수를 저장합니다.