SWEA::2817 부분수열의 합



모든 부분수열에 대해 합을 구하는 문제이다.


첫번째 방법으로

나는 누적되며 나올 수 있는 모든 합 중에 k를 초과하지 않는 것에 대해서

vector 에 누적시키면서 카운팅 했다.


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
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#include <vector>
using namespace std;
 
int t, n, k, res;
 
int main() {
 
    scanf("%d"&t);
    for (int tc = 1; tc <= t; tc++) {
        int a[20];
        vector<int> all;//k를 초과하지 않는 경우들을 누적시킬 벡터
        int cnt = 0;
 
        scanf("%d %d"&n, &k);
        for (int i = 0; i < n; i++) {
            scanf("%d"&a[i]);
            if (a[i] == k) {
                cnt++;
            }
        }
 
        for (int i = 0; i < n; i++) {
            all.push_back(a[i]);
            int size = all.size();
            //누적된 벡터내의 원소들과 더해 k가 되는지 확인
            //k==sum 이면 cnt++;
            //k<sum 이면 더해봤자 어차피 k보다 크므로 continue;
            //k>sum 이면 vector에 sum원소 추가
            for (int j = 0; j < size - 1; j++) {
                int sum = a[i] + all.at(j);
                if (sum == k) {
                    cnt++;
                }
                else if (sum > k) {
                    continue;
                }
                else {
                    all.push_back(sum);
                }
            }
        }
        printf("#%d %d\n", tc, cnt);
    }
}
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
using namespace std;
 
int t, n, k , total, cnt;
int a[20];
 
 
//백트래킹
void dfs(int v,int total) {
    total += a[v];
 
    if (total == k) {
        cnt++;
    }
    else if (total > k) {
 
    }
    else {
        for (int i = v + 1; i < n; i++) {
            dfs(i, total);
        }
    }
 
    total -= a[v];
}
int main() {
 
    scanf("%d"&t);
    for (int tc = 1; tc <= t; tc++) {
 
        cnt = 0;
 
        scanf("%d %d"&n, &k);
        for (int i = 0; i < n; i++) {
            scanf("%d"&a[i]);
        }
 
        for (int i = 0; i < n; i++) {
            total = 0;
            dfs(i,0);
        }
 
        printf("#%d %d\n", tc, cnt);
    }
 
}
cs


'SWEA::문제풀이' 카테고리의 다른 글

1953 탈주범 검거  (0) 2018.01.23
2105 디저트 카페  (0) 2018.01.21
1494 사랑의 카운슬러  (0) 2018.01.14
1265 달란트2  (0) 2018.01.10
1952 수영장  (1) 2018.01.09

+ Recent posts