https://www.acmicpc.net/problem/2961
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static int N;
static int[][] ingredient;
static boolean[] selected;
static int S = 1;
static int B = 0;
static int min = 1_000_000_000;
public static void main(String[] args) throws Exception{
// 재료의 개수 N
// S 신 맛 *, B 쓴 맛 + => 차이가 적게 + 1개 이상 선택
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
N = Integer.parseInt(br.readLine());
ingredient = new int[N][2];
selected = new boolean[N];
for(int i=0;i<N;i++){
StringTokenizer st = new StringTokenizer(br.readLine());
ingredient[i][0] = Integer.parseInt(st.nextToken());
ingredient[i][1] = Integer.parseInt(st.nextToken());
}
// 차이가 최소가 되는 값 찾기
subset(0,false);
bw.write(String.valueOf(min));
bw.flush();
br.close();
bw.close();
}
// 공집합 제거를 위해 picked 변수 추가
static void subset(int n, boolean picked){
if(n==N){
if (!picked) return; // 공집합은 출력 패스
debug();
// 크기 비교
return;
}
selected[n] = true;
subset(n+1, true);
selected[n] = false;
subset(n+1,picked);
}
static void debug(){
StringBuilder sb = new StringBuilder();
// sb.append("{");
for(int i=0;i<N;i++){
int s = ingredient[i][0];
int b = ingredient[i][1];
if(selected[i]) {
// sb.append(s).append(" ");
// sb.append(b).append("/change:");
S *= s;
B += b;
// sb.append(S).append(" ");
// sb.append(B).append("//");
}
}
if(Math.abs(S-B)<min){
min = Math.abs(S-B);
// System.out.println("Change min "+min);
}
S=1; B=0;
// sb.append("}");
// System.out.println(sb);
}
}
===
count를 만들어서 1개 이상인거로만 판단
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// Subset
public class Main {
static int N, min;
static int[][] src;
static boolean[] select;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
src = new int[N][2]; // 0:신, 1:쓴
select = new boolean[N];
min = Integer.MAX_VALUE;
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
src[i][0] = Integer.parseInt(st.nextToken()); // 신
src[i][1] = Integer.parseInt(st.nextToken()); // 쓴
}
subset(0); // 첫 번째 재료부터 시작
System.out.println(min);
}
static void subset(int srcIdx) {
// 기저 조건
if( srcIdx == src.length ) {
// complete code
// select 배열을 이용
int sin = 1;
int ssn = 0;
int cnt = 0;
for (int i = 0; i < N; i++) {
if( select[i] ) {
sin *= src[i][0]; // 신
ssn += src[i][1]; // 쓴
cnt++; // 사용한 재료 수
}
}
if( cnt > 0 ) {
min = Math.min(min, Math.abs(sin - ssn));
}
return;
}
// 선택
select[srcIdx] = true;
subset(srcIdx + 1);
// 비선택
select[srcIdx] = false;
subset(srcIdx + 1);
}
}