가면을 조금수업 조합 알고리즘사용
1) 재료로 만들 수 있는 조합 신맛수업 격렬한모든 것을 계산하다
2) 후 신맛수업 격렬한의 차이 값을 찾고 가장 작은 값을 찾습니다.
for(int() d : dp) {
d(0) = 1; //신맛 (곱해야해서 1로 초기화)
d(1) = 0; //쓴맛 (더해야해서 0으로 초기화)
}
public static void dyCook(int()() dp, int() sour, int() bitter, int visited, int N) {
for(int i = 1; i < (1 << N); i++) { //1(2) 부터 1111...1(2)까지
for(int j = 0; j < N; j++) { //각 재료에 대해
if((i & (1 << j)) != 0) { //i에 j가 들어가 있으면
dp(i)(0) *= sour(j);
dp(i)(1) += bitter(j);
}
}
}
}
(완전한 코드)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void dyCook(int()() dp, int() sour, int() bitter, int visited, int N) {
for(int i = 1; i < (1 << N); i++) {
for(int j = 0; j < N; j++) {
if((i & (1 << j)) != 0) {
dp(i)(0) *= sour(j);
dp(i)(1) += bitter(j);
}
}
}
}
public static void main(String() args) {
int N;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
try
{
N = Integer.parseInt(br.readLine());
int() sour = new int(N);
int() bitter = new int(N);
int()() dp = new int((1 << N))(2);
for(int() d : dp) {
d(0) = 1;
d(1) = 0;
}
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
sour(i) = Integer.parseInt(st.nextToken());
bitter(i) = Integer.parseInt(st.nextToken());
}
dyCook(dp, sour, bitter, 0, N);
int min = 1000000000;
int cookedVal = 0;
for(int i = 1; i < (1 << N); i++) {
cookedVal = Math.abs(dp(i)(0) - dp(i)(1));
if(cookedVal < min) min = cookedVal;
}
bw.write(Integer.toString(min));
bw.flush();
bw.close();
br.close();
}catch (Exception e)
{
e.printStackTrace();
}
}
}

