BOJ 4576 Shut the Box

BOJ 4576 Shut the Box

문제 링크:

문제 내용

당신은 다음과 같은 게임을 하려고 합니다.

  • 양의 정수 nn에 대해, 1부터 nn까지 적힌 nn장의 카드를 하나씩 앞면이 보이게 둡니다.
  • tt턴에 걸쳐서, ii번째 턴에는 목표 수 aia_i가 주어집니다. 이 턴에 당신은 앞면이 보이는 카드들 중에서 합이 aia_i인 카드들을 골라서 뒤집어야 합니다. 이것이 불가능하면 이후의 모든 턴을 잃게 됩니다.

nn, tt, 그리고 a1,a2,,ata_1, a_2, \cdots, a_t가 주어질 때, 당신이 최종적으로 뒤집을 수 있는 카드의 최대 개수를 구하세요.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 0 0으로 종료됩니다.

각 테스트 케이스에 대해, 첫 번째 줄에 nntt가 주어집니다. (1n221 \le n \le 22, 1tn1 \le t \le n)

두 번째 줄에는 a1,a2,,ata_1, a_2, \cdots, a_t가 주어집니다. (1ai221 \le a_i \le 22)

출력

각 테스트 케이스에 대해, Game {게임 번호}: {정답}의 형식으로 출력합니다.

문제 풀이

스포일러

다음과 같은 비트DP를 구성합니다.

  • DP[뒤집은 카드의 집합]: 그 시점까지 갈 수 있는지 여부

이를 다음과 같은 유사 BFS를 이용하여 해결할 수 있습니다.

  • ii번째 턴이 시작하기 전에 있을 수 있는 상태들을 큐에 저장합니다. 첫 번째 턴 이전에는 공집합 하나만 들어 있습니다.
  • a1,a2,a_1, a_2, \cdots 중에서 첫 kk개의 합을 AkA_k라고 하고, 현재 상태의 뒤집은 카드들의 합을 SS라고 합시다.
  • 큐에 있는 각 상태에 대해, 추가할 수 있는 수 중에서 AiSA_i - S 이하인 것들을 추가하고 큐에 넣습니다. 실제 BFS처럼 DP 테이블을 방문 배열로 사용하여 큐에 중복된 상태가 들어가지 않도록 합니다.
  • 큐에서 뽑은 상태들 중에서 S=AiS = A_i인 것들을 새로운 큐에 넣습니다. 또는, 0-1 BFS처럼 합이 AiA_i 미만이면 앞에 넣고 AiA_i에 도달하면 뒤에 넣으면서 새로 뽑은 합의 값을 확인해도 됩니다.

시간 복잡도는 O(2nn)\mathcal{O}(2^n n)입니다.

Last updated on