0부터 N-1에서 조합을 뽑아 이를 부분수열로 구성할 수 있음
N, S = map(int, input().split())
nums = list(map(int, input().split()))
# 현재 합이 curr인 부분수열에 원소를 추가한다
# 단 인덱스 i 이후 원소만 추가할 수 있다
def check_sum(i, curr):
# 완성된 부분수열의 합이 S와 같은지 확인
if i >= N:
if curr == S:
return 1
else:
return 0
count = 0
# 더 추가하는 경우
for j in range(i, N):
count += check_sum(j + 1, curr + nums[j])
# 더 추가 안 하고 멈추는 경우
if i > 0: # 아무것도 선택하지 않는 경우 제외
count += check_sum(N, curr)
return count
# 현재 부분수열의 합은 0
# 0번째 인덱스 값부터 더할 수 있음
print(check_sum(0, 0))
재귀 조건
check_sum(i, curr) 함수는, 현재 합이 curr인 상황에서 인덱스 i 이상의 새로운 수를 추가하려고 시도j를 순회할 때, i 이상의 인덱스만 확인할 수 있게 함j를 고를 때, check_sum(j + 1, curr + nums[j])로 호출하여 다음 재귀 호출에선 j + 1 이상의 인덱스만 고를 수 있게 구현i > 0(부분순열이 비어있지 않은 경우)일 땐 check_sum(N, curr + nums[j])를 뽑는 과정을 종료할 수 있음 (인덱스는 N-1까지만 있으므로)종료 조건
i >= N(부분순열의 모든 수를 뽑은 경우)이 된 경우S를 비교해 일치하면 1, 불일치하면 0을 반환check_sum 호출의 반환값을 계속 count 변수에 더해, 최종적으로 합이 S가 되는 부분수열의 수를 반환하게 함