문제링크 : https://www.acmicpc.net/problem/1182
이 문제는 조건을 만족시키는 부분집합의 개수를 구하는 것이다.
물론 다음과 같은 경우는 같은 부분집합이다.
{1,2}와 {2,1} == 1+2 and 2+1 = 3?
이 경우 두 집합이 다르다고 간주하여 답을 2개로 적으면 안된다. 같은 집합이기 때문이다.
따라서 우리는 기준을 정해야 한다.
나는, 입력받을 때 다른 것들보다 먼저 입력받은 인덱스를 먼저 계산하는 방식을 택했다.
다시말해 1을 체크했다면 2부터 시작할 때에는 1을 거들떠 보지도 않겠다는 뜻이다. 왜냐하면 2부터 시작할때는 1을 거쳤을 것이고 {1, 2}가 계산되었다는 뜻 이기 때문이다.
소스코드 :
이 문제는 조건을 만족시키는 부분집합의 개수를 구하는 것이다.
물론 다음과 같은 경우는 같은 부분집합이다.
{1,2}와 {2,1} == 1+2 and 2+1 = 3?
이 경우 두 집합이 다르다고 간주하여 답을 2개로 적으면 안된다. 같은 집합이기 때문이다.
따라서 우리는 기준을 정해야 한다.
나는, 입력받을 때 다른 것들보다 먼저 입력받은 인덱스를 먼저 계산하는 방식을 택했다.
다시말해 1을 체크했다면 2부터 시작할 때에는 1을 거들떠 보지도 않겠다는 뜻이다. 왜냐하면 2부터 시작할때는 1을 거쳤을 것이고 {1, 2}가 계산되었다는 뜻 이기 때문이다.
소스코드 :
#include#include using namespace std; int cnt = 0; int dest; vector origin; int Sum(vector v) { int t = 0; bool flag = false; for (int i = 0; i < v.size(); i++) { t += v[i]; flag = true; } t = flag == true ? t : dest-1; return t; } void Func(vector v, int s) { if (s > origin.size()) { return; } if (Sum(v) == dest) { cnt++; } for (int i = s; i < origin.size(); i++) { v.push_back(origin[i]); Func(v, i + 1); v.pop_back(); } } int main() { int n, s; cin >> n >> s; dest = s; for (int i = 0; i < n; i++) { int a; cin >> a; origin.push_back(a); } vector tmp; Func(tmp, 0); cout << cnt << endl; }
댓글
댓글 쓰기