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

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

스로르 왕의 황금 분배

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

요약
서로 다른 k개의 막대 값을 골라 합이 T가 되는 경우의 수를 세고, 해가 20개 이하이면 모든 해를 사전순으로 출력한다.
난이도

보통10점 중 5점

유형
동적 계획법, 백트래킹, 정렬, 조합론
정답자
아직 제출이 없습니다

문제

드워프 왕 스로르는 가장 뛰어난 전사 kk명에게 자신의 금괴 일부를 상으로 주려고 합니다. 드워프의 화폐 단위는 미리안(Mirian)입니다. 스로르는 값이 서로 다른 금괴 nn개를 가지고 있으며, 각 금괴의 가치는 v1,…,vnv_1, \dots, v_n 미리안입니다. 그는 가치의 합이 정확히 목표액 TT 미리안이 되도록 금괴 kk개를 나누어 주려고 합니다. 전사들의 공로가 저마다 달라 각자 받는 금괴의 값도 대체로 서로 다릅니다.

스로르는 동생 프로르에게, 목표액 TT를 서로 다른 금괴 정확히 kk개의 가치의 합으로 나타내는 서로 다른 방법이 몇 가지인지 세어 달라고 부탁합니다.

예를 들어 금괴가 n=10n = 10개이고 V={1,2,4,5,10,11,13,15,17,19}V = \{1, 2, 4, 5, 10, 11, 13, 15, 17, 19\}일 때, k=3k = 3개를 나누어 목표액 T=20T = 20을 만드는 방법은 네 가지입니다.

1+2+171 + 2 + 17, 1+4+151 + 4 + 15, 2+5+132 + 5 + 13, 4+5+114 + 5 + 11.

같은 목표액에서 전사가 k=4k = 4명이면 방법은 두 가지뿐입니다.

1+2+4+131 + 2 + 4 + 13, 1+4+5+101 + 4 + 5 + 10.

목표액 TT, 전사 수 kk, 금괴 값 V={v1,…,vn}V = \{v_1, \dots, v_n\}이 주어질 때, VV에서 서로 다른 값 정확히 kk개를 골라 합이 TT가 되는 서로 다른 방법의 수를 구하는 프로그램을 작성하세요. 방법의 수가 20 이하이면 모든 방법을 사전순 오름차순으로도 출력해야 합니다. 즉 가장 작은 금괴를 사용하는 방법을 먼저, 그중에서는 그다음으로 작은 금괴를 사용하는 방법을 먼저 나열하는 식입니다. 한 방법 안에서 값들은 오름차순으로 출력합니다.

입력

첫 줄에 테스트 케이스의 수 CC가 주어집니다(C≤100C \le 100). 각 테스트 케이스의 형식은 다음과 같습니다.

  • 목표액 TT와 전사 수 kk가 공백으로 구분되어 한 줄에 주어집니다(T≤500T \le 500, k≤50k \le 50).
  • 금괴의 개수 nn이 한 줄에 주어집니다(n≤100n \le 100).
  • 금괴 nn개의 값 v1,…,vnv_1, \dots, v_n이 주어집니다. 모두 서로 다른 양의 정수이며 강한 오름차순으로 정렬되어 있습니다. (여러 줄에 걸쳐 주어질 수 있습니다.)

방법의 수는 부호 있는 64비트 정수에 들어가도록 보장됩니다(즉 263−12^{63} - 1 미만입니다).

출력

각 테스트 케이스마다 주어진 순서대로 다음 블록을 출력합니다.

Test case X
 Target sum = T
 Number of warriors = k
 V = {v1, v2, ..., vn}
Number of solutions = C

여기서 X는 1부터 시작하는 테스트 케이스 번호이고, T, k, 금괴 값들은 입력을 그대로 옮긴 것입니다(중괄호 안의 값들은 쉼표와 공백으로 구분합니다). C는 목표액을 만드는 방법의 수입니다. Target sum, Number of warriors, V = {...} 줄은 각각 맨 앞에 공백 한 칸으로 시작하고, Number of solutions 줄은 그렇지 않습니다.

C가 20 이하이면 각 방법을 사전순 오름차순으로 한 줄씩 추가로 출력합니다. 각 줄은 맨 앞에 공백 한 칸으로 시작하고, 이어서 선택한 kk개의 값을 오름차순으로 공백 한 칸씩 구분하여 출력합니다.

이웃한 테스트 케이스 사이에는 빈 줄을 하나 출력합니다.

예제3

  1. 예제 1

    입력
    2
    20 3
    10
    1 2 4 5 10 11 13 15 17 19
    100 9
    19
    1 2 4 5 6 8 9 10 12 13 15 16 17 18 19 20 21 23 24
    
    예상 출력
    Test case 1
     Target sum = 20
     Number of warriors = 3
     V = {1, 2, 4, 5, 10, 11, 13, 15, 17, 19}
    Number of solutions = 4
     1 2 17
     1 4 15
     2 5 13
     4 5 11
    
    Test case 2
     Target sum = 100
     Number of warriors = 9
     V = {1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24}
    Number of solutions = 1491
    
  2. 예제 2

    입력
    1
    20 3
    10
    1 2 4 5 10 11 13 15 17 19
    
    예상 출력
    Test case 1
     Target sum = 20
     Number of warriors = 3
     V = {1, 2, 4, 5, 10, 11, 13, 15, 17, 19}
    Number of solutions = 4
     1 2 17
     1 4 15
     2 5 13
     4 5 11
    
  3. 예제 3

    입력
    1
    20 4
    10
    1 2 4 5 10 11 13 15 17 19
    
    예상 출력
    Test case 1
     Target sum = 20
     Number of warriors = 4
     V = {1, 2, 4, 5, 10, 11, 13, 15, 17, 19}
    Number of solutions = 2
     1 2 4 13
     1 4 5 10