치즈 탑
시간 제한1초메모리 제한128 MB
높이 합이 T 이하가 되도록 치즈 블록을 쌓되, 높이가 K 이상인 블록은 아래 블록을 모두 4/5 높이로 압축할 때 얻을 수 있는 최대 가치를 구한다.
문제
치즈 블록들을 높이가 최대 ()인 하나의 탑으로 쌓아 보관하려고 합니다.
치즈는 번부터 번까지 번호가 매겨진 ()가지 종류가 있고, 각 종류의 블록은 원하는 만큼 얼마든지 사용할 수 있습니다. 번 종류의 블록은 가치 ()와 높이 ()를 가지며, 모든 는 의 배수입니다.
치즈는 눌리면 압축됩니다. 높이가 () 이상인 블록을 큰 블록이라고 부릅니다. 큰 블록은 탑에서 자신보다 아래에 있는 모든 블록(다른 큰 블록 포함)을 짓누릅니다. 짓눌린 블록은 가치는 그대로지만 높이가 원래의 정확히 로 줄어듭니다. 모든 높이가 의 배수이므로 짓눌린 높이는 항상 정수가 됩니다. 짓눌림은 전부 아니면 전무입니다. 즉, 블록은 짓눌리거나 짓눌리지 않을 뿐, 위에 큰 블록이 여러 개 있다고 해서 더 많이 짓눌리지는 않습니다. 어떤 블록이 큰 블록인지는 오직 그 블록 자신의 높이로만 정해지며, 탑 전체의 높이와는 무관합니다.
총 높이가 이하인 탑 중에서 블록들의 가치 합이 최대가 되도록 쌓고, 그 최대 가치 합을 출력하세요.
예를 들어, 탑의 최대 높이가 이고 높이가 이상인 블록이 큰 블록이며 치즈가 세 종류라고 합시다.
Type Value Height
1 100 25
2 20 5
3 40 10
만들 수 있는 탑의 한 예는 다음과 같습니다.
Type Height Value
top -> [1] 25 100
[2] 4 20 (crushed by [1] above)
[3] 8 40 (crushed by [1] above)
[3] 8 40 (crushed by [1] above)
bottom -> [3] 8 40 (crushed by [1] above)
맨 위의 큰 블록이 그 아래의 모든 블록을 짓누릅니다. 총 높이는 으로 규칙에 맞고, 총 가치는 입니다. 이것이 이 블록 집합으로 만들 수 있는 가장 좋은 탑입니다.
입력
- 첫째 줄: 공백으로 구분된 세 정수 , , .
- 둘째 줄부터 째 줄까지: 째 줄에는 공백으로 구분된 두 정수 와 가 주어집니다.
출력
- 한 줄에 만들 수 있는 탑의 최대 가치 합을 출력합니다.