도영의 맛있는 음식
🪅 재료를 사용하고 말고의 문제를 부분집합으로 해석할 수 있는가 => 포함하는가 or 아닌가
🪅 부분집합을 구현할 수 있는가

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
/**
* 백준 2961번 도영이가 만든 맛있는 음식
* 입력:
* 첫째 줄에 재료의 개수 N(1 ≤ N ≤ 10)이 주어진다. 다음 N개 줄에는 그 재료의 신맛과 쓴맛이 공백으로 구분되어 주어진다.
* 모든 재료를 사용해서 요리를 만들었을 때, 그 요리의 신맛과 쓴맛은 모두 1,000,000,000보다 작은 양의 정수이다.
*
* 출력:
* 첫째 줄에 신맛과 쓴맛의 차이가 가장 작은 요리의 차이를 출력한다.
*/
public class Main {
static int()() arr2d;
static int N;
static boolean() isSelected;
static boolean isCheck;
static List<Integer> list = new ArrayList<>();
public static void subset(int num) {
// 종료조건
if(num == N) {
int sourPro = 1;
int bitterSum = 0;
for(int i = 0; i < N; i++) {
if(isSelected(i)) {
isCheck = true;
sourPro *= arr2d(i)(0);
bitterSum += arr2d(i)(1);
}
}
if(!isCheck) {
return;
}
list.add(Math.abs(sourPro-bitterSum));
return;
}
// 재귀적 확장
isSelected(num) = false;
subset(num+1);
isSelected(num) = true;
subset(num+1);
}
public static void main(String() args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr2d = new int(N)(2);
isSelected = new boolean(N);
// 재료의 개수 N만큼 신맛과 쓴맛을 입력
for(int i = 0; i < N; i++) {
StringTokenizer token = new StringTokenizer(br.readLine(), " ");
arr2d(i)(0) = Integer.parseInt(token.nextToken()); // 신맛, *
arr2d(i)(1) = Integer.parseInt(token.nextToken()); // 쓴맛, +
}
subset(0);
Collections.sort(list);
System.out.println(list.get(0));
}
}
문제 해결 과정
마지막으로 재료 녹음을 할까 말까의 문제이다
요소를 포함하거나 포함하지 않는 문제를 완전히 탐구합니다. 부분 집합로 해결할 수 있을 줄 알았는데
각 결과를 목록에 넣고 오름차순으로 정렬한 다음 첫 번째 항목을 출력하여 문제를 해결했습니다.