적절한 조합
을 찾는 문제입니다.부분집합
으로 풀 수 있습니다.해당 값 선택 + 재귀함수
그리고 해당 값 선택X + 재귀함수
를 통해 구현할 수 있습니다.import java.util.*;
public class Main {
static int N;
static food[] s; // 입력으로 들어오는 재료를 담는 변수입니다.
static food[] answer; // 부분집합으로 만든 결과를 담는 변수입니다.
static int min_val = 1; //(1,0),(0,0)인 경우도 생각해보면 1이 가장 적절한 초기값입니다.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = Integer.parseInt(sc.nextLine());
s = new food[N];
answer = new food[N];
StringTokenizer st;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(sc.nextLine()," ");
s[i] = new food(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));
}
subset(0);
System.out.println(min_val);
}
public static void subset(int depth) {
if(depth == N) {
int S_sum = 1;
int B_sum = 0;
for (int i = 0; i < N; i++) {
S_sum*=answer[i].S;
B_sum+=answer[i].B;
}
// 재료를 하나도 사용하지 않은 경우
if(S_sum == 1 && B_sum == 0)return;
min_val = Math.min(min_val, Math.abs(S_sum-B_sum));
return;
}
//depth번째 값을 선택합니다.
answer[depth] = s[depth];
subset(depth+1);
//depth번째 값을 선택하지 않습니다.
answer[depth] = new food(1,0);
subset(depth+1);
}
}
class food{
int S;
int B;
public food(int S , int B) {
this.S = S;
this.B = B;
}
@Override
public String toString() {
return "food [S=" + S + ", B=" + B + "]";
}
}