배열이 있는데 두 부분을 나누고 싶습니다. 예를 들어 [10, 30, 20, 50]
의 합은 [10, 40] , [20, 30]
으로 나눌 수 있습니다. 둘 다 합계가 50입니다. 이것은 본질적으로 파티셔닝 알고리즘이지만, 파티셔닝 가능 여부를 식별하는 것뿐만 아니라 서브 세트를 검색하고 싶습니다. 그래서, 내가 나서서 한 다음파티셔닝 알고리즘에서 하위 집합을 검색하는 방법은 무엇입니까?
업데이트 : 업데이트 스크립트가 중복
from collections import Counter
def is_partitionable(a):
possible_sums = [a[0]]
corresponding_subsets = [[a[0]]]
target_value = sum(a)/2
if a[0] == target_value:
print("yes",[a[0]],a[1:])
return
for x in a[1:]:
temp_possible_sums = []
for (ind, t) in enumerate(possible_sums):
cursum = t + x
if cursum < target_value:
corresponding_subsets.append(corresponding_subsets[ind] + [x])
temp_possible_sums.append(cursum)
if cursum == target_value:
one_subset = corresponding_subsets[ind] + [x]
another_subset = list((Counter(a) - Counter(one_subset)).elements())
print("yes", one_subset,another_subset)
return
possible_sums.extend(temp_possible_sums)
print("no")
return
is_partitionable(list(map(int, input().split())))
샘플 입력 & 출력을 처리하기 위해 :
>>> is_partitionable([10,30,20,40])
yes [10, 40] [30, 20]
>>> is_partitionable([10,30,20,20])
yes [10, 30] [20, 20]
>>> is_partitionable([10,30,20,10])
no
나는 기본적으로 해당 값을 저장하고있어 추가 된 값은 corresponding_subsets
입니다. 그러나 a
의 크기가 증가함에 따라 corresponding_subsets
에는 너무 많은 하위 목록 (possible_sums
의 요소 수와 동일)이있을 것입니다. 이 작업을 더 효율적으로 할 수있는 방법이 있습니까?
@ Ev.Kounis, 1 분주세요, 작은 버그 –
@ Ev.Kounis, Updated! –
@sasha, 아니, 나 자신을 위해이 일을하고 있지만 효율성에 대해 걱정하고있다. 목록의 거대한 목록을 저장하는 것보다 더 좋은 방법이 있어야한다고 생각한다. 배열 크기가 '10^5' + –