728x90
https://www.acmicpc.net/problem/1182
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
우선 수열의 길이가 최대 20이고, 합이 s가 되는 모든 경우를 찾아야 하므로
재귀함수를 이용한 브루트포스 방식으로 접근해보았다.
수열의 i번째 index를 탐색한다고 하면 그 이전 index는 탐색했다고 가정하고
그다음 인덱스 부터 나머지 모두를 전부 탐색하는 방식으로 재귀함수를 짜면 된다.
그리고 main함수에서는 0번째 index부터 탐색하면 된다.
그렇게 search하다가 합이 S가 되면 결과에 1을 더하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <iostream>
using namespace std;
int N,S;
int arr[21];
int answer=0;
void search(int index,int sum){
if(sum==S)
answer++;
for(int i=index; i<N; i++){
search(i+1,sum+arr[i]);
}
}
int main(void){
cin>>N>>S;
for(int i=0; i<N; i++)
cin>>arr[i];
search(0,0);
if(S==0) answer--;
cout<<answer;
}
|
'알고리즘 > 백준' 카테고리의 다른 글
백준 2143 두 배열의 합 - 단순 브루트포스 c++ (0) | 2020.02.18 |
---|---|
투 포인터 알고리즘, 슬라이딩 알고리즘 (0) | 2020.02.13 |
백준 1987 알파벳 - dfs와 백트래킹 (c++) (0) | 2020.02.12 |
백준 1110 더하기사이클 - while문, 수학 문제 (c++) (0) | 2020.02.12 |
백준 1766 문제집 - 우선순위 큐를 활용한 위상정렬 문제 (c++) (0) | 2020.02.12 |