크레이지함

시간 제한2초메모리 제한512 MB

요약
친척 수 n이 20 이하일 때 대칭 행렬로 주어지는 개인 및 쌍별 크레이지니스 값을 보고, 초대한 부분집합의 합이 최대가 되는 비어 있지 않은 부분집합을 찾는다.
난이도

보통10점 중 6점

유형
완전 탐색, 비트 연산, 수학, 구현
정답자
아직 제출이 없습니다

문제

큰 모임(명절 등)이 끝난 뒤 가족에 대해 물어보면, 사람들은 대개 자기 가족이 얼마나 크레이지한지 이야기한다.1 몇 년 동안 서로를 알아 온 데다 아마 유전적으로도 비슷하기 때문에, 가족 구성원들은 서로를 어떻게 자극하고 짜증 나게 할지 정확히 안다. 평소 조용한 사람들도 같은 방에 모이면 갑자기 미친 듯이 거칠어진다. 여기서는 총 크레이지함이 최대가 되도록 어떤 가족을 초대할지 계산하려 한다.

가족 구성원 i, j의 각 쌍마다 (양수 또는 음수) 수 ci,jc_{i,j}가 주어진다. 이는 둘 다 초대되었을 때 이 쌍이 기여하는 크레이지함이다. 음수는 이 쌍이 오히려 분위기를 가라앉힌다는 뜻이다. 목표는 비어 있지 않은(즉, 적어도 한 명은 초대해야 하는) 부분집합을 찾아 총 크레이지함이 최대가 되도록 하는 것이다. 총 크레이지함은 초대된 가족 구성원의 모든 쌍에 대한 크레이지함의 합에 모든 손님의 개별 크레이지함을 더한 값이다.

1연어에게 왜 몇 주씩 강을 거슬러 헤엄치냐고 물으면 아마 이렇게 말할 것이다. "그 파티를 빠질 수 없어. 우리 연어 가족은 크레이지하다고!!!"

입력

첫 줄에는 파일에 들어 있는 입력 데이터 세트의 수 K≥1K \ge 1이 주어진다. 그다음에 다음 형식의 데이터 세트 KK개가 이어진다.

데이터 세트의 첫 줄에는 선택할 친척의 수 2≤n≤202 \le n \le 20이 주어진다. 이어서 nn개의 줄이 주어지며, 각 줄에는 nn개의 실수 −1000.0≤ci,j≤1000.0-1000.0 \le c_{i,j} \le 1000.0이 있다. ci,jc_{i,j}는 i와 j를 둘 다 초대했을 때 더해지는 크레이지함이다. 모든 i와 j에 대해 ci,j=cj,ic_{i,j} = c_{j,i}임이 보장된다. ci,ic_{i,i}는 구성원 i 본인이 기여하는 크레이지함이다.

출력

각 데이터 세트마다 먼저 "Data Set x:"를 한 줄에 출력한다. 여기서 x는 데이터 세트의 번호이다. 그다음 이 친척들의 비어 있지 않은 부분집합을 초대해 얻을 수 있는 최대 총 크레이지함을 소수점 둘째 자리로 반올림해 출력한다.

예제1

  1. 예제 1

    입력
    1
    5
    1 -2.1 1.5 -10.3 4.7
    -2.1 0 -8.1 2.3 5.0
    1.5 -8.1 1.5 1.0 0.5
    -10.3 2.3 1.0 -1 15.4
    4.7 5.0 0.5 15.4 -2
    
    예상 출력
    Data Set 1:
    19.70