mang_dev
맹꽁거리는 개발자
mang_dev
전체 방문자
오늘
어제
  • 분류 전체보기 (185)
    • Frontend (2)
      • Next.js (1)
    • Backend (3)
      • GraphQL (2)
    • Book (1)
      • 기타 (1)
    • Old (177)
      • 알고리즘 퍼즐 (1)
      • 백준 (131)
      • 프로그래머스 (0)
      • Codility (15)
      • LeetCode (7)
      • Codewars (1)
      • Codeforces (0)
      • Django (6)
      • React (2)
      • Naver Map Api (3)
      • Web UI (4)
      • Introduction to Cloud (2)
hELLO · Designed By 정상우.
mang_dev

맹꽁거리는 개발자

백준 1182번 부분수열의 합 // C++
Old/백준

백준 1182번 부분수열의 합 // C++

2020. 3. 5. 23:07

문제

 

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

입력

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

출력

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

 


 

풀이

 

부분 수열의 크기는 1~N까지 가능하다. 이 때 수열의 합이 S가 되는 경우의 수를 출력하면 된다.

 

먼저, 크기가 1인 경우는 입력을 받으면서 S와 값을 비교하여 세주었다.

 

나머지 2~N까지의 경우는 각각 최대 크기에 따라 dfs를 통하여 합이 S가 되는지 확인하였다.

 


 

코드

더보기
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int N, S;
vector<int> num;
vector<int> v;
int res = 0;
bool visit[21] = { false, };

void dfs(int index, int size, int max_size);

int main() {
	cin >> N >> S;

	int input;

	for (int i = 0; i < N; i++) {
		cin >> input;

		if (input == S)
			res++;
		num.push_back(input);
	}

	for (int i = 2; i <= N; i++) {
		dfs(0, 0, i);
	}

	cout << res << "\n";

	return 0;
}

void dfs(int index, int size, int max_size) {
	if (size == max_size) {
		int sum = 0;
		for (int i = 0; i < v.size(); i++) {
			sum += v[i];
		}
		if (sum == S)
			res++;

		return;
	}

	for (int i = index; i < N; i++) {
		if (!visit[i]) {
			visit[i] = true;
			v.push_back(num[i]);
			dfs(i + 1, size + 1, max_size);
			v.pop_back();
			visit[i] = false;
		}
	}
}
저작자표시 (새창열림)

'Old > 백준' 카테고리의 다른 글

백준 14501번 퇴사 // C++  (0) 2020.03.11
백준 2167번 2차원 배열의 합 // C++  (0) 2020.03.10
백준 10974번 모든 순열 // C++  (0) 2020.03.05
백준 10973번 이전 순열 // C++  (0) 2020.03.05
백준 10972번 다음 순열 // C++  (0) 2020.03.05
    'Old/백준' 카테고리의 다른 글
    • 백준 14501번 퇴사 // C++
    • 백준 2167번 2차원 배열의 합 // C++
    • 백준 10974번 모든 순열 // C++
    • 백준 10973번 이전 순열 // C++
    mang_dev
    mang_dev

    티스토리툴바