반절 씩
나눠 모든 조합을 구하고 그 합을 투 포인터로 구해서 답을 구한다.combination의 범위를 mid+1 해줘야 한다. (인덱스는 0부터 시작)
from itertools import combinations
n, s = map(int, input().split())
arr = list(map(int, input().split()))
mid = len(arr) // 2
arr_l = arr[:mid]
arr_r = arr[mid:]
le, ri = dict(), dict()
for i in range(mid+1):
lecom = combinations(arr_l, i)
for com in lecom:
sm = sum(com)
if not le.get(sm):
le[sm] = 1
else:
le[sm] += 1
for i in range(len(arr)-mid+1):
recom = combinations(arr_r, i)
for com in recom:
sm = sum(com)
if not ri.get(sm):
ri[sm] = 1
else:
ri[sm] += 1
result = 0
for lval in le:
if ri.get(s - lval):
result += (ri[s - lval] * le[lval])
print(result-1 if s == 0 else result)
0
이 될 때 답에 -1을 해줘야 한다.0
이 나오기 때문이다.0
이 아닐 때는 빼줄 필요가 없다.suri78님 블로그