개념
무게 제한 안에서 물건 가치의 합을 최대화하는 문제입니다. 무게당 가치가 높은 물건부터 고르는 방식은 물건을 쪼갤 수 없는 경우 최적해를 보장하지 않습니다.
예를 들어 무게 한도가 이고 물건의 (무게, 가치)가 이라면, 무게당 가치가 가장 큰 를 먼저 골랐을 때 가치는 입니다. 반면 무게 인 두 물건을 고르면 가치가 입니다. 각 물건을 고르는 경우와 고르지 않는 경우를 함께 비교해야 합니다.
상태와 점화식
를 무게 한도가 일 때 얻을 수 있는 최대 가치로 정의합니다. 무게 , 가치 인 물건을 넣는다면 이전 무게 한도 에서 얻은 가치에 를 더합니다.
아무것도 고르지 않는 경우의 가치는 이므로 초기값은 모두 입니다. 정확히 정해진 무게를 채워야 한다면, 물건을 골라 만들 수 없는 무게는 따로 표시해야 합니다.
반복 방향
0/1 배낭에서는 각 물건을 한 번만 고릅니다. 한 물건을 처리할 때 용량을 큰 쪽부터 줄이면 아직 그 물건을 사용하지 않은 이전 상태를 참조합니다.
무제한 배낭에서는 같은 종류를 여러 개 고를 수 있습니다. 용량을 작은 쪽부터 늘리면 현재 물건을 사용한 상태를 다시 참조할 수 있습니다. 무게는 양수여야 합니다.
무게 , 가치 인 물건 하나와 한도 를 생각하면 반복 방향의 차이가 드러납니다.
- 큰 한도부터 계산하면 한도 를 처리할 때 한도 에는 아직 이 물건이 반영되지 않았습니다. 따라서 한도 의 최대 가치는 입니다. 물건 하나만 사용한 결과입니다.
- 작은 한도부터 계산하면 먼저 한도 의 가치가 이 됩니다. 이후 한도 에서는 그 값에 다시 을 더해 이 됩니다. 같은 종류를 두 개 사용한 결과입니다.
따라서 각 물건을 한 번만 고르는 0/1 배낭은 큰 한도부터, 같은 종류를 반복해서 고르는 무제한 배낭은 작은 한도부터 계산합니다. 실행 가능성은 물건 수뿐 아니라 한도 크기에도 좌우됩니다. 종류가 개이고 한도가 이면 약 만 개의 조합을 확인하지만, 한도가 이면 약 억 개로 늘어납니다.
복잡도
물건 종류를 , 무게 한도를 라고 합니다.
| 연산 | 시간복잡도 | 공간복잡도 |
|---|---|---|
| 0/1 배낭·무제한 배낭 | DP 표 |
예제
문제
물건들의 무게와 가치가 주어진다. 무게의 합이 이하가 되도록 물건을 고른다. 각 물건을 한 번만 고를 때와 각 종류를 여러 번 고를 때 얻을 수 있는 최대 가치를 각각 구하여라.
입력
첫째 줄에 물건 종류 수 과 담을 수 있는 최대 무게 가 공백을 사이에 두고 주어진다. ; 이다.
다음 개 줄에 각 종류의 무게 와 가치 가 공백을 사이에 두고 주어진다. 이다.
출력
첫째 줄에 각 물건을 한 번만 고를 때의 최대 가치를 출력한다. 둘째 줄에 각 종류를 여러 번 고를 때의 최대 가치를 출력한다.