📒

계란으로 계란치기

주차
문제번호
16987
언어
티어
실버
유형
브루트포스
백트래킹
nj_Blog
nj_상태
이해도
66%
풀이
사람
이해도 2
13 more properties

문제접근

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++
복사