일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 개발자
- 프로젝트
- 미드시청
- 영어공부
- 30분
- 만화도
- 잡생각
- Daily Challenge
- 매일
- 리얼 클래스
- 파비최
- 괜찮음
- 화상영어
- 월간
- 3줄정리
- 사이드
- realclass
- FIT XR
- 쓰릴오브파이트
- 뭐든
- English
- 운동
- 영어원서읽기
- 읽기
- Writing
- leetcode
- 10분
- 링피트
- Problem Solving
- 스탭퍼
Archives
- Today
- Total
파비의 매일매일 공부기록
5.9 0-1 배낭 - DP 본문
DP로 풀기 위해서는 2차원 캐시 리스트를 하나 만들면 된다.
배낭의 용량이 j이고 i번째 물건까지의 최대 가격을 캐시로 저장하기로 한다.
1. i번째 물건을 선택하지 않았을 때 최대 가격 : cache [i-1][j]
2. i번째 물건을 선택했을 때 최대 가격 : value [i-1] + cache [j - weight [i-1]]
물건 i를 배낭에 넣으려면 배낭에는 j - weight [i-1]의 무게만큼만 들어있어야 하므로
물건 i의 가격에 이미 계산한 cache [j - weight [i-1]]의 값을 더하면 됨.
위의 내용을 코드로 옮기면 다음과 같다.
def solve_dp(c, weight, value, n):
cache = [[0 for _ in range(c + 1)] for __ in range(n + 1)]
for i in range(1, n + 1):
for j in range(1, c + 1):
if weight[i - 1] <= j:
x = j - weight[i - 1]
cache[i][j] = max(value[i - 1] + cache[i - 1][x], cache[i - 1][j])
else:
cache[i][j] = cache[i - 1][j]
return cache[n][c]
if __name__ == '__main__':
n, c = map(int, input().split())
weight = []
value = []
for _ in range(n):
a, b = map(int, input().split())
weight.append(a)
value.append(b)
print(solve_dp(c, weight, value, n))
이번에 푼 DP도 2중 반복문의 사용으로 시간 복잡도는 최대 O(n^2)이다.
아직 이해하지 못한 부분이 좀 있어서.. 차후에 다시 한번 봐야 할 것 같다. ㅠㅠ
반응형
'Study > Algorithm 문제풀이' 카테고리의 다른 글
5.10 최장 회문 부분 수열의 길이 - DP (0) | 2021.09.24 |
---|---|
5.10 최장 회문 부분 수열의 길이 - 재귀 (0) | 2021.09.23 |
5.9 0-1 배낭 - 재귀 (0) | 2021.09.21 |
5.8 철근 자르기 - DP (0) | 2021.09.20 |
5.8 철근 자르기 - 메모전략 (0) | 2021.09.19 |
Comments