2016-10-19 11 views
0

나는 기본적인 부분 집합 합계 문제에 대해 연구 해왔다. 주어진 합계, 6, 그리고 숫자 [1,2,3,4,5,6]), 나는 s = 6에 대해 합계 된 총 조합 수를 찾아야한다고 가정 해 봅시다. [2,4], [1,2,3]).memoized subset-sum 알고리즘에서 다시 조합을 얻으시겠습니까?

나는 이것을 무력으로 해결할 수 있었지만 메모를 작성하는 방법을 찾을 수 없었으므로 코드가 충분히 큰 값을 가지면 작동하지 않습니다.

아주 잘 작동하는 memoized 알고리즘 here을 찾았지만 조합 수만을 제공합니다 (따라서 s = 6의 경우 조합 수는 3이됩니다). 조합 자체는 아닙니다. 이 문제를 모두 메모 할 수 있습니까? (매우 큰 값으로 실행할 수 있도록) 은 조합을 직접 출력 할 수 있습니까?

+1

이 재귀 알고리즘은 전체로 시작하고 값을 substracting, 만 1''반환하여 모든 가능한 솔루션 트리를 만드는이 (합계 모든 (즉, '0'에서 끝남). 큰 숫자의 경우 이것은 비단뱀 표준 재귀 깊이 내에서 완료하는 데 어려움을 겪을 수 있습니다. – AChampion

답변

0

당신은으로 itertools.combinations()을 사용하여 문제를 단순화 할 수 있습니다

>>> from itertools import combinations 
>>> s = 6 
>>> my_list = range(1, s) 
# Value of 'my_list': 
# [1, 2, 3, 4, 5] 

>>> my_combinations = [combinations(my_list, i) for i in range(2, s)] 
# Value of 'my_combinations' (in actual will be containg <combinations> objects): 
# [[(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)], [(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)], [(1, 2, 3, 4), (1, 2, 3, 5), (1, 2, 4, 5), (1, 3, 4, 5), (2, 3, 4, 5)], [(1, 2, 3, 4, 5)]] 

>>> my_required_set = [my_set for my_sublist in my_combinations for my_set in my_sublist if sum(my_set) == s] 
>>> my_required_set 
[(1, 5), (2, 4), (1, 2, 3)] 
+0

'my_combinations' 정의 내에서'list()'포장을 사용하지 마십시오; 그것은 어쨌든 한 번에 한 번씩 반복 할 필요가있을 때 불필요하게 메모리에있는 모든 조합 세트를 실현합니다. 작은 입력에 대해서는 끔찍하지 않지만 조합은 입력의 계승에 따라 큰 값을 가지며 심지어 약간 더 큰 입력 값으로도 모든 RAM을 사용할 수 있습니다. '목록'을 생략하면 거부 된 항목을 처리하기 위해 메모리가 아닌 CPU 만 사용해야합니다. – ShadowRanger

+0

@ShadowRanger : 유효한 포인트. 업데이트 대답 –

+0

답변 주셔서 감사합니다. 불행히도 그것은 메모 작성을 제공하지 않습니다. 처음에는 명확하지 않았기 때문에 원래의 질문을 편집하여 그 요구 사항을 명확하게했습니다. – rumdrums