# 생각
숫자 전체를 탐색하는 방법을 사용하면 된다
단 매순간 탐색할 때마다 숫자를 더할지 말지 체크를 해야 중복된 답이 나오지 않는다
# 전체 코드
// 2s, 256MB
// 1 <= N <= 20, |S| <= 1000000
#include <bits/stdc++.h>
using namespace std;
int n, s, cnt;
int arr[20];
// 매 순간 수를 더할지 더하지 않을지
void funcRecursive(int cur, int sum)
{
if (cur == n)
{
if (sum == s)
{
cnt++;
}
return;
}
funcRecursive(cur + 1, sum);
funcRecursive(cur + 1, sum + arr[cur]);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> s;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
funcRecursive(0, 0);
// 크기가 양수인 부분수열 중에서이므로 공집합일때는 빼줘야한다
if (s == 0)
{
cnt--;
}
cout << cnt;
}
https://www.acmicpc.net/problem/1182
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 15654_N과 M (5) with cpp (0) | 2022.02.06 |
---|---|
[BOJ] 15651_N과 M (3) with cpp (0) | 2022.02.05 |
[BOJ] 9663_N-Queen with cpp (0) | 2022.02.01 |
[BOJ] 15649_N과 M(1) with cpp (0) | 2022.01.31 |
[BOJ] 14956_Philosopher's walk with cpp (0) | 2022.01.31 |