체리 피킹

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

요약
각 범주마다 보험료를 하나씩 정해 m명 이상을 가입시키면서 총 보험료에서 급여를 뺀 이익이 최대가 되도록 한다.
난이도

보통10점 중 7점

유형
동적 계획법, 정렬, 그리디, 조합론
정답자
아직 제출이 없습니다

문제

보험은 원래 단순한 발상에서 출발했다. 모두가 공동의 기금에 돈을 내고, 그중 한두 명이 혼자서는 감당할 수 없는 재난을 당했을 때 그 사람을 지원할 만큼의 돈이 모여 있도록 하는 것이다. 가입자가 늘어날수록 관리는 복잡해지고 더 많은 규칙이 필요해졌다. 결국 이런 관리는 이윤을 추구하는 민간 기업이 훨씬 효율적으로 해낼 수 있다는 주장이 나왔다. 하지만 민간 보험사가 이윤을 극대화하려 하는 순간 유인 구조가 달라진다. 보험사는 보험이 가장 절실히 필요한 사람들, 예를 들어 노인이나 기저 질환이 있는 환자를 오히려 가장 꺼리게 된다. 이렇게 가장 수익성 높은 사람만 골라 보험에 넣으려는 행태를 체리 피킹(cherry picking) 이라고 부른다. 이 문제에서는 체리 피킹을 잘 해내는 프로그램을 작성한다.

nn명의 환자가 주어지며, 각 환자는 CC개의 범주(예: "남성, 18-30세", "여성, 25-40세" 등) 중 하나에 속한다. 각 환자에 대해, 그 환자가 1년에 낼 수 있는 최대 보험료와 당신이 그 환자에게 1년에 지급해야 할 것으로 예상되는 급여(benefits) 금액을 알고 있다. 각 범주 cc마다 보험료 pcp_c를 하나씩 정할 수 있다. 범주 cc에 속한 환자 중 낼 수 있는 최대 금액이 pcp_c 이상인 환자는 모두 보험에 가입되어 매년 pcp_c를 내고, 그 대가로 당신은 그들의 급여를 지급해야 한다. pcp_c를 감당할 수 없는 환자는 다른 곳으로 떠나 가입되지 않는다.

당신의 이윤은 거둬들인 보험료 총액에서 지급한 급여 총액을 뺀 값이다. 이 이윤이 최대가 되도록 보험료를 정해야 한다. 다만 규제 당국은 전체적으로 최소 mm명의 환자를 보험에 가입시킬 것을 요구하므로, 보험료 설정은 최소 mm명이 가입되도록 해야 한다.

입력

첫 줄에 데이터 집합의 개수 KK가 주어진다. 이어서 KK개의 데이터 집합이 다음 형식으로 주어진다.

각 데이터 집합의 첫 줄에는 세 정수 nn, CC, mm이 주어진다. 1≤n≤10001 \le n \le 1000은 환자 수, 1≤C≤301 \le C \le 30은 범주의 수, 0≤m≤n0 \le m \le n은 반드시 가입시켜야 하는 최소 환자 수이다.

이어지는 nn개의 줄에는 각 환자 ii를 나타내는 세 정수 cic_i, pip_i, bib_i가 주어진다. 1≤ci≤C1 \le c_i \le C는 환자 ii가 속한 범주, pi≥0p_i \ge 0은 환자 ii가 낼 수 있는 최대 보험료, bi≥0b_i \ge 0은 그 환자에게 지급해야 하는 급여 금액이다.

출력

각 데이터 집합에 대해 먼저 Data Set x: 를 한 줄에 출력한다. 여기서 xx는 1부터 시작하는 데이터 집합의 번호이다. 다음 줄에는 각 범주마다 보험료를 하나씩 정하고 최소 mm명을 가입시켰을 때 얻을 수 있는 최대 이윤을 정수 하나로 출력한다. 연속한 두 데이터 집합 사이에는 빈 줄 하나를 넣어 구분하며, 마지막 데이터 집합 뒤에는 빈 줄을 출력하지 않는다. 최대 이윤은 음수일 수 있다.

예제4

  1. 예제 1

    입력
    1
    8 4 5
    1 300 500
    1 500 400
    1 600 0
    3 999 0
    4 1000 1500
    3 1000 99273
    2 50 60
    2 50 70
    
    예상 출력
    Data Set 1:
    70
    
  2. 예제 2

    입력
    1
    1 1 0
    1 100 30
    
    예상 출력
    Data Set 1:
    70
    
  3. 예제 3

    입력
    1
    2 1 2
    1 10 100
    1 20 5
    
    예상 출력
    Data Set 1:
    -85
    
  4. 예제 4

    입력
    2
    1 1 0
    1 100 30
    2 1 2
    1 10 100
    1 20 5
    
    예상 출력
    Data Set 1:
    70
    
    Data Set 2:
    -85