1. ๋ฌธ์ ์ ๋ํ์ฌ ๐ฆ
- ๋ฌธ์ ๋งํฌ: https://www.acmicpc.net/problem/16987
(1) ์กฐ๊ฑด ๋ถ์ ๐
- ๊ณ๋์ด ํก์ผ๋ก ์กด์ฌํ๊ณ , ์์ฐจ์ ์ผ๋ก ํ๋์ฉ ์์ ์ฅ๋ค.
์์ ์ฅ ๊ณ๋
๊ณผํ์ ์์ง ์กด์ฌํ๋ ๊ณ๋
์ค ํ๋๋ฅผ ๋ถ๋ชํ๋ค. ๊ทธ๋ฌ๋ฉด ๊ฐ๊ฐ์ ๋ด๊ตฌ๋๊ฐ ์๋ก์ ๋ฌด๊ฒ๋งํผ ๊น์ธ๋ค.- ๋ด๊ตฌ๋๊ฐ 0 ์ดํ๋ก ๋ด๋ ค๊ฐ๋ฉด ๊นจ์ง๋ค.
- ์์ ์ฅ ์ฐจ๋ก๊ฐ ๋ ๊ณ๋์ด ์ด๋ฏธ ๊นจ์ ธ ์์ผ๋ฉด ๋์ด๊ฐ๋ค.
- ์ต๋ํ ๊ณ๋์ ๋ง์ด ๊นผ์ ๋ ๊ทธ ๊ฐฏ์๋ฅผ ๊ตฌํ๋ผ.
2. ์ฝ๋๊ฐ ๋์ค๊ธฐ๊น์ง ๐ ๏ธ
KEY WORD
: ๋ฐฑํธ๋ํน
์ด๊ฑธ ๋ฐฑํธ๋ํน์ผ๋ก ํ์ง ์์ผ๋ฉด ์ค๋ณต์์ด๋ก ํ์ด์ผ ํ๋ค. ์๋ํ๋ฉด, ์์ ์ฅ ๊ณ๋๋ง๋ค ๋๋ฆด ๊ณ๋์ ๊ณ ๋ฅผํ ๋ฐ, ์์ ์ฅ ๊ณ๋๋ง๋ค ๋๋ฆด ๊ณ๋์ ๋ฌด์กฐ๊ฑด ํ๋์ฌ์ผ ํ์ง๋ง, ๋ง๋ ๊ณ๋์ ๋ณต์์ ๊ณ๋์๊ฒ์ ๋ง์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฌด๋ฆฌ $N \leq 8$ ์ด๋ผ์ง๋ง, ์ค๋ณต์์ด์ ์๊ฐ๋ณต์ก๋ ์ ์ํํ๋ค. ๋ฐ๋ผ์ ๋ฐฑํธ๋ํน์ผ๋ก ํ์ด์ผ ํ๋ค.
๋ฐฑํธ๋ํน์ด ์ค์ฌ์ฃผ๋ ๊ฒฝ์ฐ์ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์์ ์ฅ ๊ณ๋์ด ๊นจ์ ธ์์ผ๋ฉด ๊ณ์ฐ ๊ณผ์ ์์ด ๋ค์ ๊ณ๋์ผ๋ก ๋์ด๊ฐ๋ค.
- ์์ ์ฅ ๊ณ๋๊ณผ ๊นจ์ง ๊ณ๋์ด ๊ฐ์ผ๋ฉด ๋์ด๊ฐ๋ค.
- ๋๋ฆด ๊ณ๋์ด ์ด๋ฏธ ๊นจ์ ธ ์์ผ๋ฉด ๋์ด๊ฐ๋ค.
- ๋ชจ๋ ๊ณ๋์ ํ์ธํ ๊ธฐ์ ์กฐ๊ฑด์ด ์๋๋๋ผ๋, ํ์ฌ ์์ ์ฅ ๊ณ๋ ์ ์ธ ๋ชจ๋ ๊ณ๋์ด ๊นจ์ ธ์์ผ๋ฉด ๊นจ์ง ๊ณ๋ ์ต๋๊ฐ์ ๊ฐฑ์ ํ๊ณ ํ์ถํ๋ค.
์ด ๊ฒฝ์ฐ์ ์๋ค๋ง ์ค์ฌ๋ ํ๊ธฐ์ ์ผ๋ก ์ค๋ค. ๋ค์์ ์ค๋ณต์์ด๋ก ํ์์ ๋์ ๋ฐฑํธ๋ํน์ผ๋ก ํ์์ ๋์ ์ฑ๋ฅ ์ฐจ์ด์ด๋ค.
์ค๋ณต ์์ด ํ์ด
๋ฐฑํธ๋ํน ํ์ด
์ง๊ธ๊น์ง ์ ์ผ ์ค์ํ ๊ฒ์ ์ดํดํ์ผ๋, ์ด์ ๋ฐฑํธ๋ํน์์ ์ ์ผ ์ค์ํ๊ธฐ ์ฌ์ด ๊ฒ๋ค๋ง ์กฐ์ฌํ๋ฉด ๋๋ค.
- ์ด์ ๊น์ด๋ก ๋ณต๊ทํ๊ธฐ ์ ์ ์ผ๋ ์๋ฃ๊ตฌ์กฐ ๊ฐ๋ค ํน์ ์ ์ญ ๋ณ์ ๊ฐ์ ์ฐ๊ธฐ ์ด์ ๊ณผ ๋์ผํ๊ฒ ๋๋๋ฆฌ๊ธฐ
- ๋ฌธ์ ์กฐ๊ฑด์ ๋ถ๊ธฐ ๊ท์น ์ ์งํค๊ธฐ
(1) ์๊ฐ๋ณต์ก๋ ๋ถ์ โณ
N <= 8 ์ด๊ณ , ๋ฐฑํธ๋ํน์ผ๋ก ๋ถํ์ํ ๊ฒฝ์ฐ์ ์ ๊ณ์ฐ์ ํผํ๊ธฐ ๋๋ฌธ์ ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค.
3. ์ฝ๋ ๐
import java.util.*;
import java.io.*;
public class Main {
static class Egg {
int hp;
int w;
public Egg(int hp, int w){
this.hp = hp;
this.w = w;
}
@Override
public String toString() {
return "์ฒด๋ ฅ:"+ this.hp + "\t ๋ฌด๊ฒ: " + this.w;
}
}
static int N;
static int ans = 0;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
Egg [] eggs = new Egg[N];
for(int i = 0; i < N; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
int hp = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
eggs[i] = new Egg(hp, weight);
}
recur(0, eggs, 0);
System.out.println(ans);
}
public static void recur (int depth, Egg [] eggs, int cnt){
if(depth == N) {
ans = Math.max(ans,cnt);
return;
}
// ์ด๋ฏธ ๊นจ์ง ๊ณ๋์ด๊ฑฐ๋, ์ด๊ฑฐ ์ ์ธ ๋ชจ๋ ๊ณ๋์ด ์ด๋ฏธ ๋ค ๊นจ์ง ์ํ๋ผ๋ฉด ๋ค์ ๊ณ๋์ผ๋ก ๋์ด๊ฐ๋ค.
if(eggs[depth].hp <= 0 || cnt == N-1) {
recur(depth+1, eggs, cnt);
return;
}
for(int i = 0; i < N; i++){
if(i == depth) continue;
if(eggs[i].hp <= 0) continue;
int new_cnt = cnt;
eggs[i].hp -= eggs[depth].w;
eggs[depth].hp -= eggs[i].w;
if(eggs[i].hp <= 0) new_cnt++;
if(eggs[depth].hp <= 0) new_cnt++;
recur(depth+1, eggs, new_cnt);
eggs[i].hp += eggs[depth].w;
eggs[depth].hp += eggs[i].w;
}
}
}
4. ํธ๋ฌ๋ธ ์ํ or ๋ฐฐ์ด ์ ๐
์์ ์ฅ ๊ณ๋์ด ์ด๋ฏธ ๊นจ์ ธ์์ผ๋ฉด, ๋ค์ ๊ณ๋์ผ๋ก ๋์ด๊ฐ์ง ์๊ณ ์ด์ ์ฌ๊ท๋ก ๋ณต๊ทํ ์
- ์ง๋ฌธ์ ์ ๋๋ก ์ฝ์ด์ผ ํ๋ค.
๊ธฐ์ ์กฐ๊ฑด์ ์ต๋ ๊น์ด๋ก๋ง ๊ณ์ฐํ ์
- ๋ฌธ์ ์์ ์ ๊ณตํ๋ ์์ 2๋ฒ์ ๋ณด๋ฉด, ๊น์ด๊ฐ ๊ธฐ์ ์กฐ๊ฑด๊น์ง ๊ฐ์ง ์์๋ ๋ชจ๋ ๊ณ๋์ด ๊นจ์ ธ์, ์ฌ๊ท๊ฐ ๊ธฐ์ ์กฐ๊ฑด๊น์ง ๊ฐ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ ์ต๋๊ฐ ๊ฐฑ์ ์ด ์๋์๋๋ฐ, ์ด์ ๋ํ ์์ธ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.