#문제

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
#include <iostream>
using namespace std;
 
int n, s, num[20], cnt=0;
 
void partsum(int idx, int sum){
    if( idx>=n ) return;
    int tmp = sum + num[idx];
    if( tmp == s ) cnt++;
    partsum(idx+1, sum);        // num[idx]를 포함하지 않는 경우 
    partsum(idx+1, tmp);        // num[idx]를 포함하는 경우 
}
 
int main(){
    // input 
    cin>>n>>s;
    for(int i=0; i<n; i++){
        cin>>num[i];
    }
    
    // solve
    // 1. 원소가 1개 ~ n개인 부분집합을 구한다.
    // 2. 그 부분집합의 원소의 합이 s이면 cnt를 1 증가시킨다.
    partsum(00);
    
    // 3. cnt를 출력한다.
    cout<<cnt<<'\n';
    return 0;
}
cs
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
#include <iostream>
using namespace std;
 
int n, s, cnt=0;
int nums[20];
 
int main(){
    cin>>n>>s;
    for(int i=0; i<n; i++){
        cin>>nums[i];
    }
    
    for(int bi=1; bi<(1<<n); bi++){
        int sum=0;
        // n이 5, bi가 10010이라면 우측에서부터 2번째, 5번째 인덱스 값을 포함한다는 뜻.
        // bi는 1 ~ 2^5 -1 이므로
        // bi의 개수는 원소가 5개인 집합의 부분집합 중 공집합을 제외한 개수가 된다. 
        for(int digit=0; digit<n; digit++){
            if( bi&(1<<digit) ){
                sum = sum+nums[digit];
            }
        }
        if( sum==s ) cnt++
    }
    
    cout<<cnt<<'\n';
    return 0;
}
cs

##

1. 재귀를 이용한 방법

2. 비트마스킹을 이용한 방법

'BOJ' 카테고리의 다른 글

BOJ 5430번 :: AC  (0) 2020.02.11
BOJ 3078번 :: 좋은 친구  (0) 2020.02.10
BOJ 2503번 :: 숫자 야구  (0) 2020.02.06
BOJ 10448번 :: 유레카 이론  (0) 2020.02.04
BOJ 3085번 :: 사탕 게임  (0) 2020.02.04

+ Recent posts