https://www.acmicpc.net/problem/1182
백트래킹을 이용한 브루트 포스로 모든 조합에 대해 확인
[0]
~ [n-1]
까지 차례로 확인int[]
: 입력 수열boolean[]
: 부분 수열 선택import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int n;
static int s; // 수열 원소의 합
static int[] numbers; // n개의 정수로 이루어진 수열
static boolean[] selected; // 부분 수열 선택
static int selectedCount; // 부분 수열의 원소 개수 (입력 수열의 원소에서 선택한 개수)
static int count; // 출력: 수열의 합 == s 인 부분수열의 개수
static void solution(int depth) {
if (depth == n) { // 입력 수열의 마지막 원소까지 확인한 경우
if (selectedCount == 0) // 공집합은 제외
return;
// 부분수열의 합 계산
int sum = 0;
for (int i = 0; i < n; i++) {
if (selected[i])
sum += numbers[i];
}
if (sum == s)
count++;
return;
}
// 부분 수열 구성
selected[depth] = true; // 선택 O
selectedCount++;
solution(depth + 1);
selected[depth] = false; // 선택 X
selectedCount--;
solution(depth + 1);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)
);
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
s = Integer.parseInt(st.nextToken());
numbers = new int[n];
selected = new boolean[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++)
numbers[i] = Integer.parseInt(st.nextToken());
solution(0);
System.out.println(count);
}
}