전공공부
[BOJ_1182] 부분수열의 합 본문
설명
처음에 2^20이 엄청나게 큰 수가 될 것으로 판단하여 접근을 쉽사리 못하였는데 모든 수를 탐색하면서 선택하고 안 하고를 반복해도 1048576의 반복문을 도는 것을 확인하여 아래와 같이 접근하였다.
그리고, 계속해서 75% 정도에서 틀리길래 sum == 0 인 경우를 생각해보면 모든 부분수열을 탐색하면서 모두 선택하지 않는 공집합의 경우에는 문제에서 요구하는 크기가 양수인 부분집합이 아니므로 선택 대상이 되지 않는다. 그 경우를 제외하기 위해서 if문을 추가하였다.
코드
package backtracking;
import java.io.*;
import java.util.*;
public class BOJ_1182 {
static int N;
static int arr[];
static int ans;
static int S;
public static void main(String[] args) throws Exception{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tk = new StringTokenizer(in.readLine()," ");
N = Integer.parseInt(tk.nextToken());
S = Integer.parseInt(tk.nextToken());
arr = new int[N];
ans = 0;
tk = new StringTokenizer(in.readLine()," ");
for(int i = 0; i < N; i++){
arr[i] = Integer.parseInt(tk.nextToken());
}
if(S == 0){
ans--;
}
go(0,0);
System.out.println(ans);
}
private static void go(int idx,int sum) {
if(idx == N){
if(sum == S){
ans++;
return;
}
return;
}
go(idx+1,sum);
go(idx+1,sum + arr[idx]);
}
}
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
'Study > Problem Solving' 카테고리의 다른 글
[BOJ_10971] 외판원 순회 2 (0) | 2023.10.05 |
---|---|
[BOJ_1789] 수들의 합 (1) | 2023.10.04 |
[BOJ_15664] N과 M (9~12) (1) | 2023.10.03 |
[BOJ_15656] N과 M (7) (0) | 2023.10.02 |
[BOJ_15655] N과 M (6) (1) | 2023.10.02 |