Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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
Archives
Today
Total
관리 메뉴

전공공부

[BOJ_1182] 부분수열의 합 본문

Study/Problem Solving

[BOJ_1182] 부분수열의 합

monitor 2023. 10. 4. 19:56

설명


처음에 2^20이 엄청나게 큰 수가 될 것으로 판단하여 접근을 쉽사리 못하였는데 모든 수를 탐색하면서 선택하고 안 하고를 반복해도 1048576의 반복문을 도는 것을 확인하여 아래와 같이 접근하였다.

 

그리고, 계속해서 75% 정도에서 틀리길래 sum == 0 인 경우를 생각해보면 모든 부분수열을 탐색하면서 모두 선택하지 않는 공집합의 경우에는 문제에서 요구하는 크기가 양수인 부분집합이 아니므로 선택 대상이 되지 않는다. 그 경우를 제외하기 위해서 if문을 추가하였다.

 

코드


package backtracking;

import java.io.*;
import java.util.*;

public class BOJ_1182 {
    static int N;
    static int arr[];
    static int ans;
    static int S;
    public static void main(String[] args) throws Exception{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tk = new StringTokenizer(in.readLine()," ");

        N = Integer.parseInt(tk.nextToken());

        S = Integer.parseInt(tk.nextToken());

        arr = new int[N];

        ans = 0;

        tk = new StringTokenizer(in.readLine()," ");

        for(int i = 0; i < N; i++){
            arr[i] = Integer.parseInt(tk.nextToken());
        }

        if(S == 0){
            ans--;
        }

        go(0,0);

        System.out.println(ans);

    }
    private static void go(int idx,int sum) {
        if(idx == N){
            if(sum == S){
                ans++;
                return;
            }
            return;
        }
        go(idx+1,sum);

        go(idx+1,sum + arr[idx]);
    }
}
 

1182번: 부분수열의 합

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

www.acmicpc.net

 

'Study > Problem Solving' 카테고리의 다른 글

[BOJ_10971] 외판원 순회 2  (0) 2023.10.05
[BOJ_1789] 수들의 합  (1) 2023.10.04
[BOJ_15664] N과 M (9~12)  (1) 2023.10.03
[BOJ_15656] N과 M (7)  (0) 2023.10.02
[BOJ_15655] N과 M (6)  (1) 2023.10.02