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

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

Sum It Up

면접 대비

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

요약
목표값과 최대 12개의 수가 주어질 때, 목표값이 되는 서로 다른 부분집합 합을 모두 찾아 내림차순 사전순으로 출력한다.
난이도

보통10점 중 5점

유형
백트래킹, 정렬, 완전 탐색, 재귀
정답자
아직 제출이 없습니다

문제

목표 합 tt와 nn개의 양의 정수로 이루어진 목록이 주어진다. 목록에서 수들을 골라 그 합이 정확히 tt가 되는 서로 다른 모든 방법을 찾아라. 각 수는 목록에 나타난 횟수만큼만 하나의 합에서 사용할 수 있으며, 수 하나만으로도 하나의 합으로 센다. 예를 들어 t=4t = 4이고 목록이 [4,3,2,2,1,1][4, 3, 2, 2, 1, 1]이면 44가 되는 서로 다른 합은 44, 3+13+1, 2+22+2, 2+1+12+1+1의 네 가지이다.

입력

입력에는 한 줄에 하나씩 하나 이상의 테스트 케이스가 주어진다. 각 줄에는 합 tt, 목록의 원소 개수 nn, 그리고 목록의 값 x1,x2,…,xnx_1, x_2, \ldots, x_n이 이 순서대로 공백 하나로 구분되어 주어진다. nn이 00인 줄은 입력의 끝을 나타내며 처리하지 않는다. 실제 테스트 케이스에서는 1≤t<10001 \le t < 1000, 1≤n≤121 \le n \le 12이고 각 1≤xi<1001 \le x_i < 100이다. 목록의 값은 큰 값부터 작은 값 순서(비증가 순서)로 주어지며 같은 값이 여러 번 나올 수 있다.

출력

각 테스트 케이스마다 먼저 Sums of <t>: 형식의 줄을 출력한다(단어 Sums of, 공백, 합 tt, 콜론). 그다음 조건을 만족하는 각 합을 한 줄에 하나씩, 항들을 +로 이어 출력한다. 만족하는 합이 없으면 NONE이라는 한 줄만 출력한다. 하나의 합 안에서 수들은 비증가 순서로 나열하며, 각 값은 목록에 나타난 횟수까지만 반복할 수 있다. 합들은 항의 사전식 내림차순으로 정렬한다. 즉 첫 번째 항으로 비교하고, 같으면 두 번째 항, 그다음 세 번째 항 순서로 비교한다. 한 테스트 케이스 안의 모든 합은 서로 달라야 한다.

예제1

  1. 예제 1

    입력
    4 6 4 3 2 2 1 1
    5 3 2 1 1 
    400 12 50 50 50 50 50 50 25 25 25 25 25 25
    0 0
    
    예상 출력
    Sums of 4:
    4
    3+1
    2+2
    2+1+1
    Sums of 5:
    NONE
    Sums of 400:
    50+50+50+50+50+50+25+25+25+25
    50+50+50+50+50+25+25+25+25+25+25