해결책
솔루션에는 두 부분이 있습니다. 먼저 최소 집합을 찾은 다음 전력 합 집합을 나타낼 수 있음을 증명합니다. 솔루션은 프로그래밍 구현에 맞게 조정됩니다.
최소 세트 알고리즘
합 (다중) 집합에서 최대 요소 을 찾습니다 . P , 잠재적 최소 (멀티) 세트는 초기에 비어 있습니다.amP
하나의 그룹 대표가없는 m을 까지 추가 합산 한 쌍의 모든 가능한 방법 m은 , S I J = { ( I , J ) | a i + a j = a m }amamSij={(ai,aj)|ai+aj=am}
합계 집합의 모든 요소가 포함되어 있는지 확인하십시오.
최대 요소 찾기 의 모든로부터 S의 난의 j는 다음과 같은 속성을 (함께 의미를) 각각에 대한 S 나는 J를 , 들 에 중 하나 인 S의 난의 J , 또는 우리가 찾을 수 P는 그래서 금액의 집합에서 P는 +가 들 에 S를 I의 J .asSijSijasSijapap+asSij
이 경우라면 포함하지 않는 들 바로 합 S + P를 제거 P + S 에서 S의 난의 J를 (또는 무시할 수있는 마크 세트) 삽입 P 및 을 이야 에서 S의 난의 J 대신.Sijasas+apap+asSijapasSij
요소가 모든 경우 모든 S i j에서 한 번 제거하고 (또는 무시하고 더 이상 터치하지 않도록 마크를 설정) 잠재적 인 최소 세트 P 의 요소 목록에 추가하십시오 .SijSijP
모든 가 비워 질 때까지 반복Sij
중 일부가 비어 있지 않고 계속할 수 없으면 모든 S i j 의 최대 값으로 다시 시도하십시오 .SijSij
제거하지 않고 재귀 단계를 다시 만들고 대한 전력 세트 적용 범위 알고리즘을 계속하십시오 . (이전에 P 에 두 요소의 합으로 표현 될 수없는 모든 요소가 포함되어 있는지 확실하게 확인할 수 있으므로 반드시 기본 세트에 있어야합니다. 예를 들어 최소 요소는 P에 있어야합니다 .)PPP
(10. 알고리즘의 목표 인 최소 설정 솔루션은 같은 수의 반복을 두 번 이상 포함 할 수 없습니다.)
예:
{2,3,5,7,8,10,12,13,15}
가능한 한 모든 방법으로 15를 일련의 합계에서 두 숫자의 합계로 나타냅니다.
(13,2),(12,3),(10,5),(8,7)
모든 그룹에 있거나 합계로 표시 될 수있는 최대 값을 찾으십시오. 분명히 우리는 8부터 검색을 시작할 수 있습니다.
첫 번째 그룹의 13은 13 = 8 + 5이므로 13은 괜찮지 만 두 번째 그룹의 12는 괜찮지 않습니다. 다음으로 우리는 7로 시도합니다. 그러나 즉시 13은 커버 할 수 없으며 6은 없습니다.
다음으로 5를 시도합니다. 13 = 5 + 8, 12 = 5 + 7, 10 = 5 + 5, 마지막 8 = 5 + 3 또는 7 = 5 + 2이지만 둘다는 아닙니다. 그룹은 다음과 같습니다.
((5,8),2),((5,7),3),((5,5),5),((5,3),7)
5는 모든 그룹에서 반복되므로 추출합니다 . 각 그룹에서 한 번만 5를 추출합니다.P={5}
(8,2),(7,3),(5,5),(3,7)
분명히 5보다 높은 점수는 없으므로 5를 다시 시도하십시오. 8 = 5 + 3, 7 = 5 + 2이므로 모두 괜찮습니다.
((5,3),2),((5,2),3),(5,5),(3,(5,2))
반복되므로 모든 그룹에서 다시 5를 추출하십시오. (이것은 일반적이지 않지만 반복되는 경우에 수행 할 작업을 표시하기 위해 의도적으로 작성되었습니다.) P={5,5}
(3,2),(2,3),(5),(3,2)
이제 3으로 시도하고 5 = 3 + 2가됩니다. 그룹에 추가하십시오.
(3,2),(2,3),(3,2),(3,2)
이제 3과 2가 어디에서나 반복되고 추출되기 때문에 이며 그룹은 비어 있습니다.P={5,5,3,2}
(),(),(),()
이제 제거하지 않고 재귀 단계를 다시 작성해야합니다. 이는 단순히 에서 요소를 P에 배치하고 더 이상 변경하지 않도록 표시하지 않고 위의 작업을 수행하는 것을 의미합니다 .SijP
( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7
(13,2),(12,3),(10,5),(8,7)
( ( 5 , ( 5 , 3 ) ) , 2 ) , ( ( 5 , ( 5 , 2 ) ) , 3 ) , ( ( 5 , ( 3 , 2 ) ) , 5 ) , ( ( 5 , 3 ) , ( 5 , 2 ) )((5,8),2),((5,7),3),((5,5),5),((5,3),7)
((5,(5,3)),2),((5,(5,2)),3),((5,(3,2)),5),((5,3),(5,2))
전원 설정 범위
이 부분의 목적은 찾은 최소 세트가 전력 합 세트를 포함 할 수 있는지 확인하는 것입니다. 찾은 솔루션이 주어진 모든 합계를 포괄 할 수 있지만 전력 합은 아닙니다. (기술적으로는 찾은 최소 세트에서 파워 합계 세트를 생성하고 파워 세트가 지시하는대로 각 합계가 초기 합계 세트에 있는지 확인할 수 있습니다. 이것이 이미 가지고있는 것과 합쳐서 아무것도 낭비되지 않습니다. 재귀를 되 감는 동안이 부분을 수행 할 수 있습니다.)
- 2의 연속 제곱을 사용하여 최소 세트에서 모든 요소를 인코딩하십시오. 순서는 중요하지 않습니다. 동일한 요소를 반복 할 때마다 새 값으로 인코딩하십시오. C = 1부터 시작하여 다음 요소마다 C = 2C가 있습니다.
(2=[1],3=[2],5=[4],5=[8])
- 복원 된 재귀 목록의 요소를 바꾸고
((5,(5,3)),2),((5,(5,2)),3),((5,(3,2)),5),((5,3),(5,2))
인코딩이있는 경우 : 2는 1, 3은 2, 5는 4, 또 다른 5는 8입니다. 각 요소가 반복 되더라도 다른 인코딩을 갖는지 확인하십시오.
((4,(8,2)),1),((4,(8,1)),2),((4,(2,1)),8),((8,2),(4,1))
- 우리가 가진 순간에 모든 중간 합계를 수집하십시오 (1,2,4,8)
((4,(10)),1),((4,(9)),2),((4,(3)),8),((10),(5))
(1,2,3,4,5,8,9,10)
((14),1),((13),2),((7),8),(15)
(1,2,3,4,5,8,9,10,13,14,15)
{(15),(15),(15),(15)}
2m−1mm=4
12m−1
(6,7,11,12)
- 다음과 같은 방식으로 부재를 정당화하십시오. 각 숫자를 이진 형식으로 표시하십시오.
(6=01102)
(7=01112)
(11=10112)
(12=10102)
601102(2=[1],3=[2],5=[4],5=[8]){2,3,5,7,8,10,12,13,15}따라서 모든 것이 좋습니다.
701112(2=[1],3=[2],5=[4],5=[8])
1112 는 3 + 5이고 8은 목록에 있습니다.
이진 표현을 찾을 수없는 합계에 해당하는 경우 솔루션이 없음을보고하십시오.
(2,3,5,5) 가 해결책입니다. 최소한의 솔루션이기도합니다.
토론
합이 이진 확장에 숨겨져있는 전력 집합 완료를 포함하는지 확인하는 알고리즘을 제공해야했습니다. 예를 들어 초기 예제에서 8과 7을 제외해도 첫 번째 부분은 여전히 솔루션을 제공하지만 두 번째 부분 만 누락 된 합계 조합을보고합니다.
mnlog(m)mlog2(m)mnlog(m) 이진 검색.
mlogmmlog2(m) 입니다.
mlog3(m)
알고리즘의 일부에서는 선형 시간으로 한 쌍의 합계를 찾을 수 있으며 정렬이 필요하다고 가정합니다.
잘못된 시작
2,3,4,5,6,7,8,9,10,11,12,13,152,3,4,6Sij
5,4,3,3
2,2,3,4,42,3,4,6
이 알고리즘의 목적은 솔루션을 모두 올바르게 시작한 후에 솔루션을 제공하는 것입니다.
개량
4 단계는 이러한 방식으로 업그레이드 할 수있는 단계입니다. 최대 값 대신 지정된 조건을 만족하는 모든 요소를 내림차순으로 시도 할 수 있습니다. 각각에 대해 별도의 분기를 만듭니다. 일부 지점에서 솔루션을 제공하지 않으면 취소하십시오.
2,3,4,5,6,7,8,9,10,11,12,13,157,6,5,4그들 모두가 첫 번째 시험을 통과했기 때문에 별도의 방법으로. (기본 세트에 있어야한다는 것을 알기 때문에 2 또는 3을 사용할 이유가 없습니다.) 끝까지 도달 할 수있는 모든 버전을 수집 할 때까지 계속 진행하십시오. 이렇게하면 둘 이상의 기본 세트를 발견하는 전체 범위 솔루션이 작성됩니다.
또 다른 경우는, 사건이 최소 인 경우 하나 이상의 반복을 가질 수 없다는 것을 알고 있기 때문에이를 알고리즘에 통합 할 수 있습니다.
전체적으로, 4 단계에서 숫자가 모든 그룹에서 반복되거나 합을 생성 할 수 있어야한다는 조건은 우리가 직접적인 지수 수에서 벗어날 수있을만큼 강력합니다. 이는 단순히 모든 조합을 시도하고 힘을 만드는 알고리즘입니다 일치하는 것을 찾을 때까지 각각을 설정합니다.