문제
중간고사 종료를 기념해 계획 없이 돈을 쓰던 영석이는 안타깝게도 통장 잔고가 100원도 남지 않게 되었고, 결국 영석이는 카우버거 주방 알바를 하기로 했다. 카우버거는 치즈버거와 감자튀김을 파는 중앙대학교의 유명한 음식점이다.
알바 첫날, 영석이가 주방에 들어선 순간 그는 매우 중요한 사실을 깨달았다. 사실 그는 치즈버거는 물론이고 감자튀김도 만들 줄 모른다는 것이다. 이때 다행히도 주방에는 누군가 만들어둔 치즈버거와 감자튀김이 몇 개 남아있었고, 영석이는 현재 들어온 주문을 이걸 이용해 처리하기로 했다.
모든 주문은 각각 치즈버거 요구 개수와 감자튀김 요구 개수를 의미하는 2개의 정수로 이루어진다. 어떤 주문을 처리하기 위해서는 치즈버거와 감자튀김을 정확히 그 주문에서 요구하는 만큼 써야 한다. 또한 주문이 들어온 순서와 관계없이 원하는 주문을 선택해 처리할 수 있으며, 한번 처리한 주문은 사라지므로 같은 주문을 다시 처리하는 것은 불가능하다.
아쉽게도 주방에 남아있는 것이 많지 않기 때문에 어떤 주문은 처리하지 못할 수도 있다. 최선의 방법으로 주문을 선택해 처리한다면 최대 몇 개의 주문을 처리할 수 있을까?
입력
첫째 줄에 주문의 수 N(1 ≤ N ≤ 100), 주방에 남은 치즈버거 개수 M(1 ≤ M ≤ 300), 주방에 남은 감자튀김 개수 K(1 ≤ K ≤ 300)가 주어진다.
둘째 줄부터 N개의 줄에는 주문 내용을 의미하는 두 정수 x, y (1 ≤ x, y ≤ 300)가 주어진다. x는 치즈버거 요구 개수, y는 감자튀김 요구 개수를 나타낸다.
출력
주방에 남은 치즈버거와 감자튀김을 사용해 처리할 수 있는 최대 주문 개수를 출력한다.
풀이 과정
3차원 배낭 DP 로 풀이했다.
import sys
input = sys.stdin.readline
n, m, k = map(int, input().rstrip().split())
arr = [list(map(int, input().rstrip().split())) for _ in range(n)]
dp = [[[0 for _ in range(k+1)] for _ in range(m+1)] for _ in range(n+1)]
for i in range(n+1): dp[i][0][0] = 0
for burger in range(1, m+1):
for potato in range(1, k+1):
for thing in range(1, n+1):
now_burger = arr[thing-1][0]
now_potato = arr[thing-1][1]
if burger >= now_burger and potato >= now_potato:
dp[thing][burger][potato] = max(dp[thing - 1][burger][potato], dp[thing - 1][burger - now_burger][potato - now_potato] + 1)
else:
dp[thing][burger][potato] = dp[thing - 1][burger][potato]
print(dp[n][m][k])
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 10813 : 공 바꾸기 ( BRONZE 2 ) / C, C++, Python, Java (0) | 2023.09.16 |
---|---|
[ BOJ ] 2195 : 문자열 복사 ( GOLD 5 ) / Python (0) | 2023.09.15 |
[ BOJ ] 1613 : 역사 ( GOLD 3 ) / Python (0) | 2023.09.15 |
[ BOJ ] 10810 : 공 넣기 ( BRONZE 3 ) / C, C++, Python, Java (0) | 2023.09.15 |
[ BOJ ] 2562 : 최댓값 ( BRONZE 3 ) / C, C++, Python, Java (0) | 2023.09.15 |