아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

대회 문제 분배

시간 제한1초메모리 제한128 MB

요약
세 멤버의 남은 시간과 문제별 풀이 시간을 고려해 풀 수 있는 문제 수를 최대로 배분합니다.
난이도

보통10점 중 6점

유형
동적 계획법, 비트 연산
정답자
아직 제출이 없습니다

문제

세 명으로 이루어진 팀이 프로그래밍 대회에 참가하고 있다. 세 사람 모두 문제를 전부 읽었고, 각 문제를 자기가 푸는 데 몇 분이 걸릴지 따로 추정해 두었다. 이제 남은 시간 안에 팀이 푸는 문제 수가 가장 많아지도록 문제를 나눠 맡으려고 한다.

팀원 모두 풀이를 종이에 끝까지 적은 다음 컴퓨터 앞에 앉기 때문에 컴퓨터를 기다리는 시간은 생기지 않는다. 조건은 하나뿐이다. 각 팀원이 맡은 문제의 추정 풀이 시간을 모두 더한 값이 대회에 남은 시간을 넘으면 안 된다.

한 문제는 많아야 한 사람이 맡고, 어떤 팀원에게 그 사람이 풀지 못하는 문제를 맡길 수는 없다.

입력

첫 줄에 테스트 케이스의 개수 tt (1≤t≤1001 \le t \le 100)가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다.

  • 첫 줄에 문제 수 nn (1≤n≤101 \le n \le 10)과 대회에 남은 시간 mm (1≤m≤3001 \le m \le 300)이 분 단위로 주어진다.
  • 다음 세 줄에는 각각 정수 nn개가 주어진다. ii번째 줄은 ii번째 팀원의 풀이 시간이고, 그 줄의 jj번째 정수 sijs_{ij}는 그 팀원이 jj번 문제를 푸는 데 걸리는 시간 (1≤sij≤3001 \le s_{ij} \le 300)이다. 그 팀원이 그 문제를 풀지 못하면 −1-1이다.

출력

각 테스트 케이스마다 팀이 풀 수 있는 문제 수의 최댓값을 한 줄에 출력한다.

예제1

  1. 예제 1

    입력
    1
    10 300
    10 60 -1 -1 10 10 10 240 1 30
    15 -1 30 -1 60 60 60 300 5 250
    20 -1 -1 60 60 90 90 300 2 245
    
    예상 출력
    10