본문 바로가기
BOJ

BOJ 1182 부분수열의 합

by 홍code 2022. 3. 9.

문제링크 : 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의 크기가 20이므로 부분집합의 최대크기는 2^20이 되므로 완전탐색을 사용하여도 된다. 재귀함수를 이용하여 모든 부분집합의 경우의 수를 확인하고 s가 되는 경우의 수를 세주었다.

코드

#include <iostream>
using namespace std;
int n, s, ans, arr[20];
void solve(int idx, int sum) {
	if (idx >= n) {
		if (sum == s) ans++;
		return;
	}
	solve(idx + 1, sum + arr[idx]);
	solve(idx + 1, sum);
}
int main() {
	cin >> n >> s;
	for (int i = 0; i < n; i++)
		cin >> arr[i];
	solve(0, 0);
	if (s == 0) ans--;
    cout << ans << "\n";
	return 0;
}

'BOJ' 카테고리의 다른 글

BOJ 1449 수리공 항승  (0) 2022.03.10
BOJ 4796 캠핑  (0) 2022.03.10
BOJ 1018 체스판 다시 칠하기  (0) 2022.03.09
BOJ 2503 숫자야구  (0) 2022.03.09
BOJ 10448 유레카 이론  (0) 2022.03.09

댓글