(문제해결) B2961 도영의 맛있는 음식

도영의 맛있는 음식


  🪅 재료를 사용하고 말고의 문제를 부분집합으로 해석할 수 있는가 => 포함하는가 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));
    }
}

문제 해결 과정
마지막으로 재료 녹음을 할까 말까의 문제이다
요소를 포함하거나 포함하지 않는 문제를 완전히 탐구합니다. 부분 집합로 해결할 수 있을 줄 알았는데
각 결과를 목록에 넣고 오름차순으로 정렬한 다음 첫 번째 항목을 출력하여 문제를 해결했습니다.