※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1182번 문제인 부분수열의 합이다.
문제는 아래 링크를 확인하자.
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
N의 최댓값이 20이므로, 모든 경우의 수는 많아봐야 2^20(대략 100만)가지가 된다는 것을 알 수 있다.
따라서, 단순히 모든 경우의 수를 탐색하는 것으로 이 문제는 해결할 수 있다.
같은 경우를 중복을 피해 계수하자.
아래 제출 코드에서 주석이 달린 부분이 있는 것은, 총합이 0인 경우 초기값때문에 코드상 경우의 수가 하나 더 세어지기 때문이다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int arr[20];
int currentsum = 0;
int N, S, ans = 0;
void func(int current) {
if (currentsum == S) ans++;
for (int i = current;i < N;i++) {
currentsum += arr[i];
func(i + 1);
currentsum -= arr[i];
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> S;
for (int i = 0;i < N;i++) {
cin >> arr[i];
}
if (S == 0) ans--; // currentsum의 초기값 0과 겹쳐서 한번 더 세지므로
func(0);
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 15517 // C++] Array Manipulation at Moloco (Hard) (0) | 2021.04.26 |
---|---|
[BOJ 1688 // C++] 지민이의 테러 (0) | 2021.04.25 |
[BOJ 1120 // C++] 문자열 (0) | 2021.04.23 |
[BOJ 2476 // C++] 주사위 게임 (0) | 2021.04.22 |
[BOJ 2075 // C++] N번째 큰 수 (0) | 2021.04.21 |