도구스학업·수학

배낭 문제 계산기 (0/1·분할 가능)

물건의 무게·가치와 배낭 용량을 넣으면 0/1 배낭의 최적값을 동적계획법 표로 구하고, 쪼갤 수 있는 분할 배낭의 탐욕법 답을 나란히 보여 두 답이 왜 갈리는지 확인합니다.

한 줄에 하나씩 「이름 무게 가치」. 이름을 빼고 「무게 가치」만 적어도 됩니다. 12개까지.

무게

0/1 배낭의 표가 용량에 비례해 커지므로 2,000까지만 다룹니다.

0/1 배낭 최적 가치

220

B, C — 무게 50 / 50. 동적계획법으로 구했으므로 이보다 나은 조합은 없습니다.

물건 수3개
전체 무게60
전체 가치280
0/1 배낭 (동적계획법)220
0/1 인데 비율 탐욕으로 담으면160
분할 가능 배낭 (탐욕법)240
쪼갤 수 있게 하는 것만으로 가치가 20만큼 올라갑니다. 마지막 물건을 남는 자리만큼 잘라 넣을 수 있기 때문이며, 분할 가능 배낭의 값은 언제나 0/1 배낭의 값 이상입니다. 이 차이가 0/1 배낭이 어려운 이유입니다 — 자를 수 없으니 자리가 남아도 채우지 못합니다.

「가치/무게가 큰 것부터」는 0/1에서 최적이 아니다

지금 자료가 그 예입니다. 비율 순으로 담으면 A, B를 담아 160에 그치지만, 최적은 220입니다. 비율이 가장 높은 것을 먼저 담으면 남는 자리가 어중간해져 뒤엣것이 아예 들어가지 못하기 때문입니다. 쪼갤 수 있으면 사정이 다릅니다. 마지막 하나를 잘라 자리를 남김없이 채울 수 있어, 같은 «비율이 큰 것부터» 규칙이 최적이 됩니다.

물건별 비율과 담긴 정도

물건무게가치가치/무게0/1분할
A10606담음
B201005담음담음
C301204담음66.7%

가치/무게가 큰 순서로 늘어놓았습니다. 분할 가능 배낭은 이 순서대로 담다가 딱 하나만 잘라 넣으므로, 비율이 100%가 아닌 줄은 많아야 하나입니다.

용량이 40을 넘으면 표의 칸이 너무 많아 화면에 그리지 않습니다. 계산은 그대로 하며, 표를 보려면 용량을 줄여 보세요.

계산 방법

  1. 1물건을 한 줄에 하나씩 「이름 무게 가치」로 적습니다. 이름을 빼고 「무게 가치」만 적어도 됩니다.
  2. 2배낭 용량을 넣습니다. 0/1 배낭은 무게가 정수여야 표를 만들 수 있습니다.
  3. 30/1 배낭의 최적값과 담을 물건을 확인합니다.
  4. 4같은 자료에서 분할 가능 배낭의 답과 「비율이 큰 것부터」 담았을 때의 답을 견주어 봅니다.
  5. 5용량이 40 이하면 동적계획법 표가 그대로 나오므로 어느 칸에서 답이 만들어지는지 따라가 봅니다.

자주 묻는 질문

물건을 쪼갤 수 있느냐가 다릅니다. 0/1 배낭은 물건을 통째로 담거나 아예 안 담거나 둘 중 하나여서 동적계획법으로 풀어야 하고, 분할 가능 배낭은 일부만 잘라 담을 수 있어 「가치/무게」가 큰 것부터 담는 탐욕법이 최적입니다. 그래서 분할 가능 배낭의 답은 언제나 0/1 배낭의 답 이상입니다.

0/1 배낭에서는 그렇지 않습니다. 용량 50에 (무게 10, 가치 60)·(20, 100)·(30, 120)을 주면 비율 순으로 담을 때 앞의 둘만 들어가 160에 그치지만, 뒤의 둘을 담으면 220입니다. 비율이 가장 높은 것을 먼저 담으면 남는 자리가 어중간해져 뒤엣것이 아예 못 들어가기 때문입니다. 쪼갤 수 있을 때만 이 규칙이 최적입니다.

「앞의 i개 물건만 쓰고 용량이 w일 때 담을 수 있는 최대 가치」입니다. 각 칸은 바로 위 칸(그 물건을 안 담는 경우)과 「위쪽에서 그 물건의 무게만큼 왼쪽 칸 + 그 물건의 가치」(담는 경우) 가운데 큰 쪽으로 채웁니다. 오른쪽 맨 아래 칸이 답이며, 거기서 위로 되짚어 값이 바뀌는 지점이 실제로 담은 물건입니다.

0/1 배낭에서는 넣을 수 없습니다. 동적계획법 표가 용량을 0, 1, 2, …로 한 칸씩 훑는 구조라 소수 무게를 놓을 자리가 없기 때문입니다. 단위를 바꿔 정수로 만들어 넣으면 됩니다 — 1.5kg은 무게 15로, 나머지도 100g 단위로 맞추는 식입니다. 분할 가능 배낭은 소수 무게로도 계산합니다.

동적계획법의 계산량이 「물건 수 × 용량」에 비례하기 때문입니다. 물건이 10개여도 용량이 100만이면 칸이 1,000만 개가 됩니다. 용량을 2진수로 적었을 때의 자릿수를 기준으로 보면 지수적으로 늘어나는 셈이라 이를 의사다항 시간이라 부르며, 배낭 문제가 NP-난해인데도 이 표가 실용적으로 돌아가는 이유이자 한계입니다. 이 계산기는 용량 2,000까지 다룹니다.

표를 되짚을 때 값이 바뀐 칸만 「담았다」고 보므로, 값이 같으면 담지 않은 쪽을 고릅니다. 그래서 앞쪽 물건을 덜 쓰는 조합이 나옵니다. 교재의 답과 담은 물건이 달라도 최적값 자체는 같습니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 검증은 교과서 예제(용량 50, 물건 (10,60)·(20,100)·(30,120))에서 0/1 220·분할 240·비율 탐욕 160이 나오는 것과, 무작위 자료 400벌에서 동적계획법의 답이 완전탐색의 답과 일치하는 것으로 했습니다. 되짚어 고른 조합의 무게 합이 용량을 넘지 않고 가치 합이 최적값과 같은지도 함께 대조했습니다.
  • 0/1 배낭은 무게가 양의 정수여야 합니다. 소수가 섞이면 계산하지 않고 단위를 바꾸도록 안내합니다.
  • 「비율이 큰 것부터 담기」는 0/1 배낭에서 최적을 보장하지 않습니다. 이 계산기가 그 값을 함께 보이는 것은 답으로 쓰라는 뜻이 아니라 최적과 얼마나 벌어지는지 보이기 위한 것입니다.
  • 물건 12개, 용량 2,000까지 다룹니다. 동적계획법 표는 용량 40 이하·물건 8개 이하일 때만 화면에 그립니다.
  • 같은 물건을 여러 개 담는 무한 배낭(unbounded knapsack)은 범위 밖입니다. 개수 제한이 없는 경우는 동전 거스름돈 계산기 쪽이 가깝습니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.