백준 c++/(1-2)백준 c++ 알고리즘 기초

백준 1182 부분수열의 합 c++

현구구 2023. 1. 10. 11:12

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

 

1182번: 부분수열의 합

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

www.acmicpc.net


문제

N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 합이 S가 되는 부분수열의 개수를 출력한다.


#include <iostream>

using namespace std;

int N, S;
int arr[21];
bool check[21];
int resultCount = 0;
int result[21];
void dfs(int start, int count)
{

	for (int k = 1; k <= N; k++)//부분수열이 1개 원소부터 N개 원소까지 있을 수 있기 때문
	{
		if (k == count)
		{
			int sum = 0;
			for (int j = 0; j < k; j++)
			{
				sum+=result[j];
			}
			if (sum == S)
			{
				resultCount++;
			}
		}
		continue;
	}
	for (int i = start; i <= N; i++)
	{
		if (check[i])
			continue;
		check[i] = true;
		result[count] = arr[i];
		dfs(i, count + 1);
		check[i] = false;
	}
	return;
}
int main()
{
	cin >> N >> S;
	for (int i = 1; i <= N; i++)
	{
		cin >> arr[i];	
	}
	dfs(1, 0);
	cout << resultCount;
}

1.dfs에서 인자로 count 정수형 변수를 준다. count는 부분 수열 원소의 개수를 나타낸다.

2.dfs내 for(k는 1~N까지)반복문을 통해 count==k가 될 때 부분수열의 합(sum) == S인지를 판별해주면

count 가 1일 때, count 가 2일 때 .... count가 N 일 때 까지 판별해주게 된다.

'백준 c++ > (1-2)백준 c++ 알고리즘 기초' 카테고리의 다른 글

백준 13023 ABCDE c++  (0) 2023.01.10
백준 14391 종이 조각 c++  (0) 2023.01.10
백준 11723 집합 c++  (0) 2023.01.10
백준 2529 부등호 c++  (0) 2023.01.10
백준 15661 링크와 스타트 c++  (0) 2023.01.09