반응형
https://www.acmicpc.net/problem/1182
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
* 부분 수열
원소 {A, B, C} 라면,
depth=0일 때는 아무것도 선택하지 않았을 때, 부분수열 = {Ø}
depth=1일때는 이전 부분수열에 A를 가졌냐 안 가졌나로 나누어짐. 부분수열 = {A}, {Ø}
depth=2일 때는 이전 부분수열에 B를 가졌냐 안 가졌나로 나누어짐. 부분수열 = {AB}, {A}, {B}, {Ø}
depth=3일 때는 이전 부분수열에 C를 가졌냐 안 가졌나로 나누어짐. 부분수열 = {ABC}, {AB}, {AC}, {BC}, {A}, {B}, {C}, {Ø}
이런 식으로 진행이 된다.
import java.io.*;
import java.util.*;
public class Main {
static int N,S,cnt=0;
static int[] num;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
N = sc.nextInt(); //정수 개수
S = sc.nextInt(); //목표 합이 되는 수
num= new int[N]; //정수 담는 배열
for(int i=0;i<N;i++)
num[i]=sc.nextInt();
dfs(0,0);
if(S==0) //부분수열의 크기가 0일때를 고려
cnt-=1;
System.out.println(cnt);
}// main()
static void dfs(int depth, int sum) {
if(depth==N) {
if(sum==S) cnt++;
return;
}
dfs(depth+1,sum+num[depth]); //지금 위치원소를 선택 했거나
dfs(depth+1,sum); //안했거나
}
}// class Main
728x90
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
백준 18870 : 좌표 압축 _자바 Java (0) | 2023.01.29 |
---|---|
백준 6603 : 로또 _자바 Java (0) | 2023.01.28 |
백준 10799 : 쇠막대기 _자바 Java (0) | 2023.01.28 |
백준 4963 : 섬의 개수 _자바 Java (0) | 2023.01.26 |
백준 11279 : 최대 힙 _자바 Java (0) | 2023.01.26 |
댓글