벡터 파티션은 벡터를 일련의 벡터로 분할하여 합계가 원래가되도록합니다. 다음은 몇 개의 파티션입니다.
[3, 1, 2] = [3, 1, 2]
[3, 1, 2] = [0, 0, 1] + [0, 0, 1] + [0, 1, 0] + [1, 0, 0] + [2, 0, 0]
[3, 1, 2] = [1, 1, 2] + [2, 0, 0]
여기서 벡터 추가는 요소별로 수행됩니다. 유효한 파티션에는 음의 정수를 가진 벡터 나 0이 아닌 벡터가 없습니다.
이제 목표 벡터가 주어지면 가능한 모든 벡터 파티션을 생성하는 프로그램이나 함수를 작성하는 것이 과제입니다. 이것은 비교적 쉬운 것처럼 들릴 수 있습니다 ...
...하지만 비틀기가 있습니다. 입력 벡터의 크기가 L이고 생성하는 가장 큰 파티션에 M 개의 요소가있는 경우 O (L * M) 이상의 메모리를 사용할 수 없습니다.
정수가 O (1) 메모리를 사용한다고 가정 할 수 있습니다. 즉, 파티션을 생성 할 때 파티션을 출력해야합니다. 또한 각 파티션을 정확히 한 번만 출력해야합니다. 예를 들어, 이들은 동일한 파티션입니다.
[3, 1, 2] = [3, 0, 2] + [0, 1, 0]
[3, 1, 2] = [0, 1, 0] + [3, 0, 2]
당신이 출력했다면 두 대답 모두 유효하지 않습니다.
의 모든 파티션 [3, 2]
:
[3, 2]
[0, 1] + [3, 1]
[0, 1] + [0, 1] + [3, 0]
[0, 1] + [0, 1] + [1, 0] + [2, 0]
[0, 1] + [0, 1] + [1, 0] + [1, 0] + [1, 0]
[0, 1] + [1, 0] + [2, 1]
[0, 1] + [1, 0] + [1, 0] + [1, 1]
[0, 1] + [1, 1] + [2, 0]
[0, 2] + [3, 0]
[0, 2] + [1, 0] + [2, 0]
[0, 2] + [1, 0] + [1, 0] + [1, 0]
[1, 0] + [2, 2]
[1, 0] + [1, 0] + [1, 2]
[1, 0] + [1, 1] + [1, 1]
[1, 1] + [2, 1]
[1, 2] + [2, 0]
답을 테스트하려면에서 실행하십시오 [3, 2, 5, 2]
. 17939 개의 파티션을 생성해야합니다.이 파티션은 모두 합쳐지고 [3, 2, 5, 2]
고유합니다 (먼저 사전에 각 파티션을 정렬하여 고유성을 테스트 할 수 있음).
바이트 단위의 최단 코드가 이깁니다.