# 생각

숫자 전체를 탐색하는 방법을 사용하면 된다

단 매순간 탐색할 때마다 숫자를 더할지 말지 체크를 해야 중복된 답이 나오지 않는다

 

 

# 전체 코드

// 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

+ Recent posts