17208 카우버거 알바생

정민용·2023년 5월 4일
0

백준

목록 보기
175/286

문제

중간고사 종료를 기념해 계획 없이 돈을 쓰던 영석이는 안타깝게도 통장 잔고가 100원도 남지 않게 되었고, 결국 영석이는 카우버거 주방 알바를 하기로 했다. 카우버거는 치즈버거와 감자튀김을 파는 중앙대학교의 유명한 음식점이다.

알바 첫날, 영석이가 주방에 들어선 순간 그는 매우 중요한 사실을 깨달았다. 사실 그는 치즈버거는 물론이고 감자튀김도 만들 줄 모른다는 것이다. 이때 다행히도 주방에는 누군가 만들어둔 치즈버거와 감자튀김이 몇 개 남아있었고, 영석이는 현재 들어온 주문을 이걸 이용해 처리하기로 했다.

모든 주문은 각각 치즈버거 요구 개수와 감자튀김 요구 개수를 의미하는 2개의 정수로 이루어진다. 어떤 주문을 처리하기 위해서는 치즈버거와 감자튀김을 정확히 그 주문에서 요구하는 만큼 써야 한다. 또한 주문이 들어온 순서와 관계없이 원하는 주문을 선택해 처리할 수 있으며, 한번 처리한 주문은 사라지므로 같은 주문을 다시 처리하는 것은 불가능하다.

아쉽게도 주방에 남아있는 것이 많지 않기 때문에 어떤 주문은 처리하지 못할 수도 있다. 최선의 방법으로 주문을 선택해 처리한다면 최대 몇 개의 주문을 처리할 수 있을까?

# 17208
import sys
input = lambda: sys.stdin.readline().strip()

n, m, k = map(int, input().split())
order = []
for _ in range(n):
    cheese, fri = map(int, input().split())
    if cheese > m or fri > k:
        continue
    else:
        order.append([cheese, fri])

knapsack = [[[0] * (k+1) for _ in range(m+1)] for _ in range(n+1)]

for a in range(1, len(order)+1):
    cheese, fri = order[a-1][0], order[a-1][1]
    knapsack[a][cheese][fri] = 1
    
    for i in range(m+1):
        for j in range(k+1):
            if cheese > i or fri > j:
                knapsack[a][i][j] = knapsack[a-1][i][j]
            else:
                knapsack[a][i][j] = max(knapsack[a-1][i][j], knapsack[a-1][i-cheese][j-fri]+1)

max_cnt = 0
for k in knapsack[len(order)]:
    max_cnt = max(max_cnt, max(k))
print(max_cnt)

백준 17208 카우버거 알바생

0개의 댓글