n의 범위가 1부터 8까지이기 때문에 브루트 포스 & 백트래킹을 하면 풀리는 문제이다.
주의할 점: hand== n인 기저조건까지 도달하기 위해 모든 조건에서 backtracking함수를 실행시켜야 한다는 것이다. '
++괜히 경우의 수를 출력한다고 했다가 너무 많은 경우의 수라서 무한 루프 도는 것처럼 보였다...
#include <stdio.h>
#include <algorithm>
#define MAX 8
//n=8이기 때문에 다 해보기
using namespace std;
int n, result = 0;
int eggs[MAX][2];
void BackTracking(int hand, int broke)
{
if (hand == n)
{
result = max(result, broke);
return;
}
if (eggs[hand][0] <= 0)
{
BackTracking(hand + 1, broke);
return;
}
bool flag = true;
for (int i = 0; i < n; i++)
{
if (i == hand || eggs[i][0] <= 0)
continue;
int tmp = 0;
eggs[hand][0] -= eggs[i][1];
if (eggs[hand][0] <= 0)
{
tmp++;
}
eggs[i][0] -= eggs[hand][1];
if (eggs[i][0] <= 0)
{
tmp++;
}
flag = false;
BackTracking(hand + 1, broke + tmp);
eggs[hand][0] += eggs[i][1];
eggs[i][0] += eggs[hand][1];
}
if (flag)
BackTracking(hand + 1, broke);
}
int main(void)
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d%d", &eggs[i][0], &eggs[i][1]);
}
BackTracking(0, 0);
printf("%d\n", result);
return 0;
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 2193] 이친수 (0) | 2020.11.14 |
---|---|
[백준 2293] 동전1 (0) | 2020.11.14 |
[백준 14891] 톱니바퀴 (0) | 2020.11.07 |
[백준 1182] 부분수열의 합 (0) | 2020.11.05 |
[백준 9663]N-Queen (0) | 2020.11.05 |
댓글