티스토리 뷰
문제
유명한 동적계획법 문제중 하나인 냅색(knapsack) 문제를 풀어 보자. 몇 개의 물건이 있고 각 물건에는 무게와 가치라는 2개의 매개변수가 주어진다. 일정한 무게까지 물건을 배낭에 넣을 수 있다고 할 때 가치의 합계가 최대가 되려면 물건을 배낭에 어떻게 넣어야 할까?
풀이
동적계획법을 적용하는 굉장히 유명한 문제로 동적계획법을 이해하는 정석과 같은 문제이다. 핵심은 전체탐색을 하되 이전에 했던 계산을 다시 재활용 하도록 만든다는 점이다. 이를 위해 이차원 배열을 선언하고 배열은 i번째 선택에서 총무게가 j일 때 가지는 최대 가치로 설정한다. 같은 횟수의 선택일 때 같은 무게에서 이미 구한 값 보다 더 낮은 가치라면 굳이 탐색할 필요가 없으니 수행시간이 상당히 줄어들게 된다. 코드은 다음과 같다.
function knapsack(nowWeight, nowPrice, n, start)
{
if (n > weight.length && start > weight.length) return;
if (dp[n][nowWeight] > nowPrice) return;
dp[n][nowWeight] = nowPrice;
if (maxPrice < nowPrice) maxPrice = nowPrice;
for (int i = start; i < weight.length; i++) {
if (weight[i] + nowWeight <= maxWeight) {
knapsack(weight[i] + nowWeight, n+1, i+1);
}
}
}
코드의 간단함을 위해서 초기 값이 들어오는 변수나 정답을 출력하는 변수는 모두 전역변수인 것으로 처리했다.
'algorithm' 카테고리의 다른 글
악수 문제(카달란 수) (0) | 2018.07.31 |
---|---|
기부금 최대값 찾기 (0) | 2018.07.30 |
가장 먼 출구 찾기 (너비우선탐색) (0) | 2018.07.27 |
가장 큰 곱 만들기 문제 (0) | 2018.07.26 |
가장 많은 취미 찾기 (0) | 2018.07.26 |
- Total
- Today
- Yesterday
- Warning
- 클린코드
- 마르코프
- DP
- 로그
- 전략패턴
- 디자인패턴
- 크롬
- 야근
- html
- 자바스크립트 개론
- 동적계획법
- 경고
- RESTful
- 마르코프 연쇄
- 문장 생성기
- Count
- CONVENTIONS
- GROUP BY
- 자바스크립트개론
- Spring in Action
- REST API
- 코딩의 기술
- was
- java
- 유지보수
- 몰라서망신
- restful api
- markov chain
- Markov
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |