본문 바로가기
Algorithm/Baekjoon

Baekjoon 1182 부분수열의 합 JAVA

by Hunveloper 2022. 6. 17.
728x90

 

1182번: 부분수열의 합

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

www.acmicpc.net

문제

N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 합이 S가 되는 부분수열의 개수를 출력한다.

풀이

각 수열의 값을 더하는 경우와 더하지 않는 경우 모든 수를 탐색하며, 더한 수의 값이 S가 되는 경우 ans값을 1씩 증가시킨다.

코드
import java.util.*;
import java.io.*;

public class Main {
	static int n, s, ans;
	static int [] arr;
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n=Integer.parseInt(st.nextToken());
		s=Integer.parseInt(st.nextToken());
		arr = new int [n];
		st = new StringTokenizer(br.readLine());
		for(int i=0;i<n;i++)
			arr[i]=Integer.parseInt(st.nextToken());
		dfs(0,0);
		if(s==0)	// 찾는 값이 0이면 처음 temp값을 0으로 넣기에 공집합이 1개 카운팅된다
			ans--;	// 그래서 -1을 해줌
		System.out.println(ans);
	}
	
	public static void dfs(int d,int temp) {
		if(d==n) {	// 끝까지 계산하고
			if(temp==s)	// 값이 찾는 값과 동일하면 ans++
				ans++;
			return;
		}
		dfs(d+1, temp);	// i번째 원소를 선택안하는 경우
		dfs(d+1, temp+arr[d]);	// i번째 원소를 선택하는 경우
	}
}

 

728x90
728x90

'Algorithm > Baekjoon' 카테고리의 다른 글

Baekjoon 16173 점프왕 쩰리 (Small) JAVA  (0) 2022.06.18
Baekjoon 12100 2048 (Easy) JAVA  (0) 2022.06.18
Baekjoon 1189 컴백홈 JAVA  (0) 2022.06.17
Baekjoon 1059 좋은 구간 JAVA  (0) 2022.06.17
Baekjoon 15841 Virus Outbreak JAVA  (0) 2022.06.17

댓글