아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

초콜릿 나누기

시간 제한2초메모리 제한1024 MB

요약
직사각형 초콜릿을 격자선을 따라 잘라 주어진 크기의 n개 직사각형 조각으로 정확히 나눌 수 있는지 판정한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 비트 연산, 백트래킹, 분할 정복
정답자
아직 제출이 없습니다

문제

초콜릿은 전 세계 수많은 사람이 매일 즐기는 간식이다. 거의 모든 나라에서 팔리는, 정말로 보편적인 과자다.

초콜릿을 먹는 것보다 더 좋은 일은 친구와 나누어 먹는 것이다. 그런데 친구들은 까다롭고 식욕도 제각각이다. 어떤 친구는 더 많이, 어떤 친구는 더 적게 원한다. 이들의 요구를 만족시킬 수 있는지 판단하기가 갈수록 어려워졌다. 이제 이 문제를 완전히 해결하는 프로그램을 작성할 때다.

초콜릿은 직사각형 막대 모양이다. 막대는 크기가 같은 직사각형 조각들로 이루어져 있다. 초콜릿을 나누려면 막대의 행 사이 또는 열 사이의 경계를 따라 두 조각으로 자를 수 있다. 그렇게 얻은 조각도 같은 방식으로 계속 자를 수 있다. 친구들은 각자 지정된 개수의 조각으로 이루어진 직사각형 한 덩어리를 받아야 한다. 당신도 조금은 고집이 세다. 남는 조각 없이 초콜릿 전체를 친구들에게 나눠 줄 수 있을 때만 막대를 자르려고 한다.

예를 들어 그림 9는 3 × 4개의 조각으로 이루어진 초콜릿 막대를 3번 잘라 6개, 3개, 2개, 1개 조각으로 이루어진 4부분으로 나누는 한 가지 방법을 보여 준다. (이는 첫 번째 샘플 입력에 해당한다.)

그림 9

입력

입력은 여러 테스트 케이스로 이루어지며, 각 테스트 케이스는 나눌 초콜릿 막대 하나를 나타낸다. 각 테스트 케이스의 첫 줄에는 막대를 나누려는 부분의 개수 n (1 ≤ n ≤ 15)이 주어진다. 다음 줄에는 초콜릿 막대의 크기 x와 y (1 ≤ x, y ≤ 100)가 주어진다. 그다음 줄에는 n개의 양의 정수가 주어지며, 이는 n개 부분 각각에 들어가야 할 조각의 개수다.

입력은 정수 0이 있는 줄로 끝난다.

출력

각 테스트 케이스마다 먼저 케이스 번호를 출력한다. 그다음 원하는 방식으로 초콜릿을 나눌 수 있는지 출력한다. 가능하면 "Yes", 불가능하면 "No"를 출력한다. 샘플 출력의 형식을 따르라.

예제1

  1. 예제 1

    입력
    4
    3 4
    6 3 2 1
    2
    2 3
    1 5
    0
    
    예상 출력
    Case 1: Yes
    Case 2: No