Skip to content

Commit

Permalink
✍️ update: additional knapsack explanation
Browse files Browse the repository at this point in the history
- 배낭 문제 설명 보완
  • Loading branch information
marunemo committed Dec 19, 2023
1 parent a8636f4 commit 6ec44eb
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 2 deletions.
28 changes: 26 additions & 2 deletions algorithm/knapsack.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,15 @@ parent: 알고리즘
{: .fw-700 }

<div class="code-example" markdown="1">
배낭 문제는 최대로 담을 수 있는 무게가 주어진 가방에 무게와 가치를 알고 있는 물건을 가치의 합이 최대가 되도록 담는 조합을 찾는 문제이다.
물건을 나누어 담을 수 있는가와 나누어 담을 수 없는가에 따라 풀이 방식이 나뉘게 된다.
배낭 문제는 각 요소들의 비용과 그 가치가 주어질 때, 임의로 정한 비용을 초과하지 않는 범위 내에서 가치의 합이 최대가 되도록 선택하는 조합을 찾는 문제이다.
간단하게 말하면, 내가 현재 가지고 있는 배낭에 최대로 담을 수 있는 무게가 정해져 있고 배낭에 넣을 짐들의 무게와 가치를 알고 있을 때,
가치의 합이 최댓값이 되도록 짐을 고르는 방법을 찾는 문제이다.

![sample.png](../assets/knapsack_0.png)
{: .mx-4 .mt-2 }

배낭 문제는 물건을 나누어 담을 수 있는가와 나누어 담을 수 없는가에 따라 풀이 방식이 나뉘게 된다.
이러한 문제 유형을 각각 [분할 가능 배낭 문제](#분할-가능-배낭-문제)[0-1 배낭 문제](#0-1-배낭-문제)이라고 부른다.
</div>

## 분할 가능 배낭 문제
Expand Down Expand Up @@ -66,6 +73,9 @@ float knapsack() {
반대로 현재 용량보다 해당 물건의 총 무게가 더 클 경우, `(가치 / 무게) × 남은 용량`만큼만 더하고 반복문을 탈출한다.
결과적으로 가치가 높은 물건 순으로 넣을 수 있을 때까지 나누어 넣으면, 넣을 수 있는 물건의 가치의 합이 최대가 된다.
{: .mt-1 }

{: .highlight }
물건을 배낭에 나누어 담을 수 있을 경우에는 무게 대비 가치가 가장 높은 물건들만 고려하면 되는 그리디 알고리즘이 적합하다.
</div>

## 0-1 배낭 문제
Expand All @@ -76,6 +86,16 @@ float knapsack() {

수식으로 나타내자면,
{: .pl-3 .d-inline .v-align-middle }
각 물건의 무게
{: .d-inline .v-align-middle }
![w_i](https://wikimedia.org/api/rest_v1/media/math/render/svg/fe22f0329d3ecb2e1880d44d191aba0e5475db68)
{: .d-inline .v-align-middle }
와 가치
{: .d-inline .v-align-middle }
![v_i](https://wikimedia.org/api/rest_v1/media/math/render/svg/7dffe5726650f6daac54829972a94f38eb8ec127)
{: .d-inline .v-align-middle }
에 대하여
{: .d-inline .v-align-middle .mr-1 }
![x_range](https://wikimedia.org/api/rest_v1/media/math/render/svg/07dda71da2a630762c7b21b51ea54f86f422f951)
{: .d-inline .v-align-middle }
Expand Down Expand Up @@ -158,4 +178,8 @@ memo[index - 1][curr - weight[i]] + value[i];
{: .mx-4 .mt-2 .mb-6 }
물론, 공기나 물건을 다 빼고 물건 4를 넣었을 때, 그 값이 더 작다면 기존의 값을 유지한다.
이 과정을 0에서 실제 최대 용량인 w까지 반복을 하고, n번째 물건까지 모두 확인한 뒤에 용량이 w일 때의 값이 배낭에 담을 수 있는 가치의 합의 최댓값이 된다.

{: .highlight }
물건을 배낭에 나누어 담을 수 없는 경우에는 모든 물건들에 대해 각 물건을 넣을 때와 넣지 않을 때 중 최댓값을 찾아야하므로,
다이나믹 프로그래밍이나 백트래킹 등의 조합 최적화 알고리즘을 사용해야 한다.
</div>
Binary file added assets/knapsack_0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/knapsack_2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 6ec44eb

Please sign in to comment.