배낭 문제
시간 제한2초메모리 제한1024 MB
물건들의 무게와 용량 c가 주어질 때, 총무게가 c 이하인 부분집합들이 매트로이드를 이루는지 판정합니다. 아니라면 위반된 공리와 반례 집합을 출력합니다.
문제
배낭 문제는 다음과 같이 정의된다. 개의 물건이 있고, 번째 물건의 무게는 , 가치는 이다. 물건의 무게 합이 배낭의 용량 를 넘지 않도록 물건을 골라 가치의 합이 최대가 되는 집합을 구한다. 배낭 문제는 NP-난해하지만, 물건 무게의 총합에 비례하는 시간에 동적 계획법으로 풀 수 있다.
그러나 일부 경우에는 배낭 문제를 탐욕법으로 풀 수 있다. 그중 하나는 배낭 문제의 인스턴스가 매트로이드를 이루는 경우이다.
매트로이드는 순서쌍 이다. 는 유한 집합이고, 는 의 부분집합들로 이루어진 족이다. 의 원소를 독립 집합이라고 부른다. 는 다음 공리를 만족해야 한다.
- ;
- 이고 이면, 이다;
- 이고 이면, 인 가 존재하여 이다.
여기서 는 집합 에 속한 물건의 개수이다.
매트로이드의 예로, 무방향 그래프의 간선 집합을 들 수 있다. 간선 집합에 사이클이 없으면 독립 집합이다.
물건들의 무게가 이고, 이 물건 전체를 로 둔다. 물건 번호의 집합 은 를 만족하면 독립 집합이라고 한다. 주어진 과 에 대해 이 구성이 매트로이드를 이루는지 판정한다.
입력
첫 줄에 정수 ()이 주어진다. 둘째 줄에는 정수 ()이 주어진다. 셋째 줄에는 정수 ()가 주어진다.
출력
배낭 문제의 해의 집합이 매트로이드를 이루면 YES를, 그렇지 않으면 NO를 출력한다.
그렇지 않은 경우에는 둘째 줄에 위배되는 공리의 번호를 정수 하나로 출력한다. 공리 2 또는 공리 3이 위배되면, 다음 두 줄에 공리가 성립하지 않는 집합 와 를 출력한다. 각 집합은 물건의 개수를 먼저 쓰고, 그 뒤에 물건 번호들을 쓴다.