반응형
0/1 배낭(Knapsack) 문제 해설 동영상과 파이썬 예제 코드
배낭에 물건을 최대 가치로 선택하여 넣을 때,
각 물건이 한 개씩만 존재하는 경우 어떻게 해결하지를 다루는 동영상입니다.
동영상에서 그래프 구조, 재귀호출, 가지치기, 그리디 같은 알고리즘도 소개하고 있네요,
참고로 파이썬 코드는 아래에 있으니 참고하세요.(사전을 이용한 동적 프로그래밍 방식)
# 제로원 배낭 문제
# 사전을 이용한 동적 프로그래밍 예제 코드
import sys
input = sys.stdin.readline
N, K = map(int, input().split()) # 아이템 개수, 배낭 용량
bag = {0:0}
for _ in range(N):
w, v = map(int, input().split()) # 아이템 무게, 가치 입력
temp = {} # 임시 사전
for dw, dv in bag.items(): # 백에 있는 것들 가져오기
nw, nv = dw + w, dv + v # 추가한 무게, 가치
if nw <= K: # 배낭에 넣을 수 있을 때
# 같은 무게일 때 더 높은 가치를 선택
# get(nw, 0): nw 키가 없으면 0 반환
temp[nw] = max(bag.get(nw, 0), nv)
bag.update(temp) # 가방 업데이트 (무게별 최대 가치들로 갱신)
print(max(bag.values())) # 들어간 무게 중에서 가장 높은 가치 출력
[실행 결과]
4 20
4 4
7 7
5 6
6 7
24 <-- 답
반응형
'알고리듬과 수학' 카테고리의 다른 글
다이나믹 프로그래밍 타일링 문제 풀어보기 동영상 (0) | 2021.04.29 |
---|---|
파이썬, 0/1 제로원 배낭(Knapsack) 문제 동영상과 파이썬 코드 (0) | 2021.04.25 |
깊이우선탐색 DFS & 너비우선탐색 BFS 동영상 모음 (0) | 2021.04.20 |
세상에서 가장 아름다운 수식 (동영상) (0) | 2021.04.15 |
카탈란 수와 괄호 쌍 문제 (0) | 2021.02.15 |