문제가 상당히 긴데 계란으로 계란을 치는 것이다.
계란으로 계란을 치게 되면 각 계란의 내구도는 상대 계란의 무게만큼 깎인다.
계란을 치는 방법은
이 과정을 반복한다.
백트래킹으로 풀었고 다른 백트래킹 문제보다 조건이 많아서 조금 까다롭다(?)
import java.awt.desktop.PreferencesEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.Buffer;
import java.sql.Array;
import java.util.*;
class Egg{
int state;
int weight;
public Egg(int state, int weight){
this.state = state;
this.weight = weight;
}
@Override
public String toString() {
return "Egg{" +
"state=" + state +
", weight=" + weight +
'}';
}
}
public class Main {
public static List<Egg> list = new ArrayList<>();
public static int answer = 0;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
for(int i=0;i<n;i++){
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
list.add(new Egg(a, b));
}
dfs(0, 0);
System.out.println(answer);
}
public static void dfs(int dept, int breakCount){
answer = Math.max(answer, breakCount);
if(dept == list.size()){
// System.out.println("dept == list.size() return");
return;
}
if(list.get(dept).state <= 0) {
// System.out.println("dept = " + dept + " 잡은 계란 깨짐");
dfs(dept+1, breakCount);
return;
}
for(int i=0;i<list.size();i++){
// dept는 현재 쥔 계란, cnt는 때릴 계란
if(dept == i) continue;
//현재 쥔 계란이 깨진 경우
if(list.get(i).state <= 0) continue;
Egg gripEgg = list.get(dept);
Egg targetEgg = list.get(i);
// System.out.println("------------------------------------");
// System.out.println("dept = " + dept + " i = " + i);
// System.out.println("변경 전");
// System.out.println("current Egg = " + gripEgg);
// System.out.println("target Egg = " + targetEgg);
// for(Egg element : list){
// System.out.println(element);
// }
list.set(dept, new Egg(gripEgg.state - targetEgg.weight, gripEgg.weight));
list.set(i, new Egg(targetEgg.state - gripEgg.weight, targetEgg.weight));
int breakEgg = 0;
if(list.get(dept).state <= 0){
breakEgg++;
}
if(list.get(i).state <= 0){
breakEgg++;
}
// System.out.println("변경 후");
// System.out.println("current Egg = " + list.get(dept));
// System.out.println("target Egg = " + list.get(i));
// for(Egg element : list){
// System.out.println(element);
// }
dfs(dept+1, breakCount + breakEgg);
// System.out.println("--------------------------------");
// System.out.println("백트래킹 전");
// for(Egg element : list){
// System.out.println(element);
// }
list.set(dept, gripEgg);
list.set(i, targetEgg);
// System.out.println("백트래킹 후");
// for(Egg element : list){
// System.out.println(element);
// }
}
}
}