만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

배낭 문제

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

요약
물건들의 무게와 용량 c가 주어질 때, 총무게가 c 이하인 부분집합들이 매트로이드를 이루는지 판정합니다. 아니라면 위반된 공리와 반례 집합을 출력합니다.
난이도

보통10점 중 5점

유형
수학, 그리디, 완전 탐색
정답자
아직 제출이 없습니다

문제

배낭 문제는 다음과 같이 정의된다. nn개의 물건이 있고, ii번째 물건의 무게는 w_iw\_i, 가치는 v_iv\_i이다. 물건의 무게 합이 배낭의 용량 cc를 넘지 않도록 물건을 골라 가치의 합이 최대가 되는 집합을 구한다. 배낭 문제는 NP-난해하지만, 물건 무게의 총합에 비례하는 시간에 동적 계획법으로 풀 수 있다.

그러나 일부 경우에는 배낭 문제를 탐욕법으로 풀 수 있다. 그중 하나는 배낭 문제의 인스턴스가 매트로이드를 이루는 경우이다.

매트로이드는 순서쌍 ⟨X,I⟩\langle X, {\cal I}\rangle이다. XX는 유한 집합이고, I\cal I는 XX의 부분집합들로 이루어진 족이다. I\cal I의 원소를 독립 집합이라고 부른다. I\cal I는 다음 공리를 만족해야 한다.

  1. I≠∅{\cal I} \ne \varnothing;
  2. A∈IA \in {\cal I}이고 B⊂AB \subset A이면, B∈IB \in {\cal I}이다;
  3. A,B∈IA, B \in {\cal I}이고 ∣A∣>∣B∣|A| > |B|이면, x∈A∖Bx \in A \setminus B인 xx가 존재하여 B∪{x}∈IB \cup \{x\}\in{\cal I}이다.

여기서 ∣A∣|A|는 집합 AA에 속한 물건의 개수이다.

매트로이드의 예로, 무방향 그래프의 간선 집합을 들 수 있다. 간선 집합에 사이클이 없으면 독립 집합이다.

물건들의 무게가 w_1,w_2,…,w_nw\_1, w\_2, \ldots, w\_n이고, 이 물건 전체를 XX로 둔다. 물건 번호의 집합 {i_1,i_2,…,i_k}\{i\_1, i\_2, \ldots, i\_k\}은 w_i_1+w_i_2+…+w_i_k≤cw\_{i\_1}+w\_{i\_2}+\ldots+w\_{i\_k} \le c를 만족하면 독립 집합이라고 한다. 주어진 w_1,w_2,…,w_nw\_1, w\_2, \ldots, w\_n과 cc에 대해 이 구성이 매트로이드를 이루는지 판정한다.

입력

첫 줄에 정수 nn (1≤n≤501 \le n \le 50)이 주어진다. 둘째 줄에는 정수 w_1,w_2,…,w_nw\_1, w\_2, \ldots, w\_n (1≤w_i≤1001 \le w\_i \le 100)이 주어진다. 셋째 줄에는 정수 cc (max⁡w_i≤c≤∑w_i\max w\_i \le c \le \sum w\_i)가 주어진다.

출력

배낭 문제의 해의 집합이 매트로이드를 이루면 YES를, 그렇지 않으면 NO를 출력한다.

그렇지 않은 경우에는 둘째 줄에 위배되는 공리의 번호를 정수 하나로 출력한다. 공리 2 또는 공리 3이 위배되면, 다음 두 줄에 공리가 성립하지 않는 집합 AA와 BB를 출력한다. 각 집합은 물건의 개수를 먼저 쓰고, 그 뒤에 물건 번호들을 쓴다.

예제2

  1. 예제 1

    입력
    3
    1 2 3
    4
    
    예상 출력
    YES
    
  2. 예제 2

    입력
    3
    3 4 5
    7
    
    예상 출력
    NO
    3
    2 1 2
    1 3