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가 되는 부분수열의 개수를 출력한다.
import java.util.*;
import java.io.*;
public class BOJ_1182 {
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int result;
static int count = 0;
static boolean[] isSelected;
static int[] input;
public static void subset(int idx) {
if(idx == input.length) {
int tmp = 0;
boolean flag = false;
for (int i = 0; i < isSelected.length; i++) {
if(isSelected[i]) {
tmp += input[i];
flag = true;
}
}
if(tmp == result && flag) {
count++;
}
return;
}
isSelected[idx] = true;
subset(idx+1);
isSelected[idx] = false;
subset(idx+1);
}
public static void main(String[] args) throws Exception{
st = new StringTokenizer(in.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
result = Integer.parseInt(st.nextToken());
input = new int[N];
isSelected = new boolean[N];
st = new StringTokenizer(in.readLine(), " ");
for (int i = 0; i < input.length; i++) {
input[i] = Integer.parseInt(st.nextToken());
}
subset(0);
System.out.println(count);
}
}
'Algorithms > BOJ' 카테고리의 다른 글
[Java] 11279. 최대 힙 (0) | 2021.02.17 |
---|---|
[Java] 17928. 오큰수 (0) | 2021.02.16 |
[Java] 2309. 일곱난장이 (0) | 2021.02.14 |
[Java] 1149. RGB 거리 (0) | 2021.02.12 |
[Java] 17478. 재귀함수가 뭔가요? (0) | 2021.02.11 |