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 |