728x90
문제
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 |
댓글