티스토리 뷰

www.acmicpc.net/problem/1182

 

1182번: 부분수열의 합

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

www.acmicpc.net

백트래킹 문제이지만 백트래킹으로 안 풀고 브루트포스로 풀었다. (너무 잠이 와서 생각을 멈췄다.)

n개의 수가 입력 받으면 그 수의 부분 수열의 합이 주어진 s와 같은게 몇 개나 있는지 구하는 문제이다.

문제 자체는 어렵지 않지만, 백트래킹이 더 코드도 깔끔하고 시간도 줄어서 내일 풀어보려 한다.

 

브루트포스는 다음과 같이 하면 된다.

n=10이라 예를 들면 10으로 만들 수 있는 index의 조합을 모두 구한다. (ex) 10C1, 10C2, ..., 10C10

그리고 해당 index의 배열 값을 더해서 s와 같은지 확인하면 된다.

 

코드는 다음과 같다.

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int n, s;
vector<int>v;
vector<vector<int>>combination;

void make_combination(int n, int r)
{
	combination.clear();
	vector<int>com;

	vector<int>vec;
	for (int i = 0; i < n; i++) {
		vec.push_back(i);
	}
	vector<int>idx;
	for (int i = 0; i < r; i++) {
		idx.push_back(1);
	}
	for (int i = 0; i < (n - r); i++) {
		idx.push_back(0);
	}
	sort(idx.begin(), idx.end());

	do {
		for (int i = 0; i < n; i++) {
			if (idx[i] == 1) {
				com.push_back(vec[i]);
			}
		}
		combination.push_back(com);
		com.clear();
	} while (next_permutation(idx.begin(), idx.end()));
}

int main()
{
	int res = 0;
	cin >> n >> s;
	for (int i = 0; i < n; i++) {
		int a;
		cin >> a;
		v.push_back(a);
	}

	int tmp_sum;
	for (int i = 1; i <= n; i++) {
		combination.clear();
		make_combination(n, i);

		for (int j = 0; j < combination.size(); j++) {
			tmp_sum = 0;
			for (int k = 0; k < combination[j].size(); k++) {
				tmp_sum += v[combination[j][k]];
			}
			if (tmp_sum == s)
				res++;
		}
	}

	cout << res;
}

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

백준 / 11437 LCA C++  (0) 2021.01.13
백준 / 2294 동전 2 C++  (0) 2021.01.12
백준 / 2437 저울 C++  (0) 2021.01.06
백준 / 17144 미세먼지 안녕! C++  (0) 2021.01.02
BOJ / 백준 / 1051 숫자 정사각형 C++  (0) 2020.12.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함