문제접근
void solution(int current)
{
int flag = 0;
if (가장 마지막 계란까지 왔다면)
{
지금까지 계란이 얼마나 깨졌는지 확인하고
깨진 계란들을 업데이트(최대값으로)
}
if (현재 잡은 계란의 내구도가 0이하라면)
{
다음 계란으로 넘어감
}
for (int i = 0; i < n; i++)
{
if (놓아져있는 계란이 이미 깨져있는 경우)
continue ;
서로 깬 계란들의 내구도 계산
그 다음 계란을 집고 똑같은 과정 반복
내구도 원상복구
}
if (계란들이 모두 깨져있다면)
다음 계란으로 넘어감
}
C++
복사
놓쳤던 부분
•
flag를 통해서 더 이상 깰 계란이 없거나 현재 계란을 사용할 수 없을 경우 다음 계란으로 넘어갈 수 있도록 해줘야 한다
코드
2016 KB
64 ms
#include <iostream>
#include <utility>
#include <algorithm>
int n;
std::pair<int, int> egg[8];
int answer = 0;
void input_setting()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
}
void input()
{
std::cin >> n;
for (int i = 0; i < n; i++)
std::cin >> egg[i].first >> egg[i].second;
}
void solution(int current)
{
int flag = 0;
if (current == n)
{
int count = 0;
for (int i = 0; i < n; i++)
if (egg[i].first <= 0)
count++;
answer = std::max(answer, count);
return ;
}
if (egg[current].first <= 0)
{
solution(current + 1);
return ;
}
for (int i = 0; i < n; i++)
{
if (i == current || egg[i].first <= 0)
continue ;
flag = 1;
egg[current].first -= egg[i].second;
egg[i].first -= egg[current].second;
solution(current + 1);
egg[current].first += egg[i].second;
egg[i].first += egg[current].second;
}
if (!flag)
solution(current + 1);
}
void print()
{
std::cout << answer;
}
int main(void)
{
input_setting();
input();
solution(0);
print();
return (0);
}
C++
복사