본문으로 바로가기

[비트마스크] 1182 부분 수열의 합

category ps/브루트 포스 2021. 9. 21. 17:21

부분 수열의 합 (1182)

 

풀이코드

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
using namespace std;
// 1182 부분수열의 합

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr); 
	cout.tie(nullptr); 
	
	int n, s;
	
	cin >> n >> s;
	cin.ignore();
	
	int arr[20];
	
	for(int i = 0 ; i < n; i++){
		cin >> arr[i];
	}
	int ans = 0;
	
	for(int bm = 1; bm < (1 << n); bm++){
		int sum = 0;
		for(int i = 0; i < n; i++){
			// bm 에 i 가 들어있으면
			if(bm & ( 1 << i )){
				// sum 에 추가
				sum += arr[i];
			}
		}
		if(sum == s) ans++;
	}
	cout << ans << '\n';
}

 

해설


적용한 레시피 / 방법론 + 접근법

풀이

1. n 의 크기가 최대 20으로 작으므로 비트마스크를 사용할 수 있겠다.

2. n 크기의 비트마스크를 0 부터 n 까지 순회해보자. ( 하지만, 문제에서 말했듯이 공집합 0 은 제외해야 함)

아쉬웠던 부분 / 오답 원인 / 개선해야 할 점

 

반응형

'ps > 브루트 포스' 카테고리의 다른 글

[재귀] 14888 연산자 끼워넣기  (0) 2021.10.16
[순열] 단어수학 (boj.kr/1339)  (0) 2021.10.10
[순열] 6603 로또  (0) 2021.09.21
[순열][재귀] 외판원 순회 2 10971  (0) 2021.09.21
[순열] 10819 차이를 최대로  (0) 2021.09.21