백준(BOJ)

[Python/파이썬] - 백준(BOJ) 1182번 : 부분수열의 합

phanre 2022. 5. 7. 03:04

https://www.acmicpc.net/problem/1182

 

1182번: 부분수열의 합

첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.

www.acmicpc.net

 

단순 브루트포스 문제.

1번 원소를 더한 후 2~n번 원소를 더하는 함수를 호출하고

그 함수에서는 3~n번 원소를 더하는 함수를 호출한다.

이 과정을 1~n번 원소 모두 실행하면 답이 나온다

 

누적 합을 이용하여 중간에 프루닝 하는 방법을 이용하려 했으나

n이 충분히 작아 시간초과가 나지 않을 것 같아 모든 원소를 탐색하였다.

def Back(sum, index):
    global answer
    sum += arr[index]
    if sum == m:
        answer += 1
    if index == n-1:
        return
    for i in range(index+1, n):
        Back(sum, i)

n, m = map(int,input().split())
arr = sorted(list(map(int,input().split())))
answer = 0
for i in range(n):
    Back(0, i)
print(answer)