본문 바로가기

브루트 포스/브루트포스(비트마스크)

부분 집합의 합

https://www.acmicpc.net/problem/1182

 

1182번: 부분수열의 합

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

www.acmicpc.net

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
32
33
#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
    int n;
    int m;
    int ans = 0;
    cin >> n >> m;
    vector<int> a(n);
 
    for (int i = 0; i < n; i++)
        cin >> a[i];
 
    // 모든 부분집합을 만들자 (공집합 제외)
    for (int i = 1; i < (1 << n); i++)
    {
        int sum = 0;
        for (int k = 0; k < n; k++)
        {
            // 부분집합 검사
            if (i & (1 << k))
                sum += a[k];
        }
        if (sum == m)
            ans += 1;
    }
 
    cout << ans << '\n';
 
    return 0;
}
cs

'브루트 포스 > 브루트포스(비트마스크)' 카테고리의 다른 글

구슬 탈출 2 (중요!!)  (0) 2023.09.21
가르침 (어렵다..)  (0) 2023.09.16
종이 조각 (중요!!!)  (0) 2023.03.03
스타트와 링크 with 비트마스크  (0) 2023.03.01
비트마스크  (0) 2023.02.25