📈알고리즘/알고리즘
배낭문제 Knapsack
하얀성
2023. 4. 24. 13:32
배낭에 넣을 물건의 부분담기를 허락하지 않는다.그래서 그리디가 아닌, 동적 계획법을 통해 최적해를 구한다.시간 복잡도는 O(nC)
<Knapsack 슈도 코드>
입력: 배낭의 용량 C, n개의 물건과 각 물건 i의 무게 wi와 가치 vi, 단, i = 1, 2, ... n
출력: K[n,C]
1 for i = 0 to n K[i, 0
] = 0 // 배낭의 용량이 0일 때
2 for w = 0 to C K[0,w] = 0 // 물건 0이란 어떤 물건도 배낭에 담기 위해 고려하지 않았을 때
3 for i = 1 to n {
4 for w = 1 to C { // w는 배낭의 (임시)용량이고, 마지막에는 w=C가 되어 배낭의 용량이 된다.
5 if( wj > w ) // 물건 i의 무게가 임시 배낭의 용량을 초과하면
6 K[i,w] = K[i-1,w]
7 else
8 K[i,w] = max{K[i-1,w], K[i-1,w-wi]+vi}
}
}
9 return K[n,C]
<배낭문제 문제 풀어보기>
