https://www.acmicpc.net/problem/2961
import java.util.*;
import java.lang.*;
import java.io.*;
// The main method must be in a class named "Main".
class Main {
public static List<int[]> generateCombinations(int[] arr,int m){
List<int[]> combinations=new ArrayList<int[]>();
int[] combination=new int[m];
generateCombination(combinations,0,0,m,arr,combination);
return combinations;
}
public static void generateCombination(List<int[]> combinations,int start,int index,int m,int[] arr,int[] combination){
if(index==m){
combinations.add(combination.clone());
return;
}
for(int i=start;i<arr.length;i++){
combination[index]=arr[i];
generateCombination(combinations,i+1,index+1,m,arr,combination);
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=i;
}
int[][] food=new int[n][2];
for(int i=0;i<n;i++){
food[i][0]=sc.nextInt();
food[i][1]=sc.nextInt();
}
double answer=1000000000;
for(int i=1;i<n+1;i++){
List<int[]> combinations=generateCombinations(arr,i);
for(int[] combination : combinations){
double s=1;
double b=0;
for(int k : combination){
s*=food[k][0];
b+=food[k][1];
}
answer=Math.min(answer,Math.abs(s-b));
}
}
System.out.println((int)answer);
}
}
도영이가 만든 음식의 재료가 N개 있고 각 재료의 신맛 S와 쓴맛 B가 주어졌을 때 해당 재료를 적절히 섞어서 만들 수 있는 요리 중 가장 신맛과 쓴맛의 차이를 구하는 문제이다.
재료가 최대 10개이기 때문에 모든 재료의 조합을 구해내는 방법, 즉 수학적 조합을 사용해서 모든 케이스를 구해낼 수 있다. 재료의 갯수에 따라 모든 조합을 순회하면서 각 케이스에 대한 신맛과 쓴맛의 차이를 정답으로써 갱신해주면 된다.
이렇게 Java로 백준의 "도영이가 만든 맛있는 음식" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊