https://www.acmicpc.net/problem/2073
배관을 사용하여 수도관을 만드는데, 그 중 최대용량이 되도록 만드는 문제이다.
처음에 문제 이해 자체를 잘못하여 많이 돌아온 문제이다. 문제를 정확히 이해해보면, 파이프를 이용하여 딱 길이가 D인 수도관을 만들 것인데, 수도관의 용량은 그것을 구성하는 파이프들의 용량 중 최솟값이다. 다시말해 여러 조합들로 만들 수 있지만 용량은 그것중 가장 작은 값이 된다는 말이다.
그 중 최대용량이 되도록 파이프를 조합해보는 문제이다.DP문제인 만큼, 현재 상태를 기록해가며 문제를 풀 수 있도록 점화식을 만들어 보았다.
여러 파이프를 한번에 받기 보다는, 그때 그때 입력받아서 이 파이프를 사용할 것인지 아닌지를 판별하는 방식이 메모리와 시간을 맞출 수 있는 방법이다.
길이가 L이고 용량이 C인 파이프가 입력으로 주어진다. 그렇다면 이 파이프를 사용하는 경우와 사용하지 않는 경우중 최대의 용량을 선택하면 된다.
import sys
input = sys.stdin.readline
D, P = map(int, input().split())
dp = [0] * (D + 1)
dp[0] = 1e9 ##무한대의 값을 나타내기 위함
for _ in range(P):
l, c = map(int, input().split())
tmp = dp[:]
for i in range(l, D + 1):
if tmp[i-l]:
dp[i] = max(dp[i], min(tmp[i - l],c)) # 사용할 경우, 사용하지 않을 경우 중 최대값을 저장
print(dp[D])