백준 1182 부분수열의 합
본문 바로가기
알고리즘 모음집/알고리즘 (Algorithm)

백준 1182 부분수열의 합

by KyeongMin 2019. 7. 24.
728x90
반응형

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

 

1182번: 부분수열의 합

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

www.acmicpc.net

부분 수열 이문제는 

 

1개부터 N개까지 모든 경우를 뽑아내서 더해서 합이 S와 같은 갯수가 몇개 인지 세면되는데
비트로 생각하면 이렇게 뽑히면 되는겁니다.

이렇게 해서 1인부분의 합이 S가 되는 것을 세면 되는 문제로 엄청 쉬워집니다.
무튼 오늘은 아래 소스가 로또 문제랑 비슷하니 로또 문제도 풀어보시고 이문제도 풀어보시면 좋을것 같습니다.
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<stdio.h>
using namespace std;
int N, S;
int input[21];
int num[21];
int cnt = 0;
void dfs(int s,int idx) {
    if (idx > N)return;
    if (idx>=1&&idx <= N) {
        int ret = 0;
        for (int y = 0, ten = 1; y < N; y++,ten*=10) {
            if (num[y] == 1)ret += input[y];
        }
            if (ret == S)cnt++;
    }
    for (int i = s; i < N; i++) {
        if (num[i] == 0) {
            num[i] = 1;
            dfs(i+1,idx + 1);
            num[i] = 0;
        }
    }
 
}
int main(void) {
    scanf("%d %d"&N, &S);
    for (int i = 0; i < N; i++) {
        scanf("%d"&input[i]);
    }
    dfs(0,0);
    printf("%d", cnt);
    return 0;
}
 
 

오늘은 여기까지이고 감사합니다.

728x90
반응형

'알고리즘 모음집 > 알고리즘 (Algorithm)' 카테고리의 다른 글

백준 1244 스위치 켜고 끄기  (0) 2019.07.28
백준 1941 소문난 칠공주  (0) 2019.07.28
백준 11723 집합  (0) 2019.07.24
백준 6603 로또  (0) 2019.07.24
백준 1339 단어 수학  (0) 2019.07.23

댓글