반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 코딩테스트
- Web
- 클린코드
- CleanCode
- Spring
- inflearn
- SWEA
- front-end
- 구현
- algorithm
- Color
- Kotlin
- 순환
- javascript
- codecademy
- SQL
- 알고리즘
- 프로그래머스
- java
- DP
- 해슁
- CSS
- android
- html
- DFS
- 정렬
- BFS
- 다이나믹 프로그래밍
- 자바
- 검색트리
Archives
- Today
- Total
깡뇽
[백준] 12865번 평범한 배낭 파이썬 본문
반응형
DP 유형에 속하는 여러 문제들을 풀어보고자 해당 문제를 골랐다.
필요하다고 생각하는 N개의 물건에는 각각 무게 W와 가치 V가 있고, 최대 K만큼의 무게까지만 배낭에 담을 수 있다. 최대한 즐거운 여행을 할 수 있도록 물건들의 가치의 최댓값을 찾아야 한다.
12865번 평범한 배낭 풀이
[시도1] 맞았습니다!! with 솔루션
N, K = map(int, input().split())
W = [0]
V = [0]
dp = [[0]*(K+1) for _ in range(N+1)]
for _ in range(1, N+1):
w, v = map(int, input().split())
W.append(w)
V.append(v)
for i in range(1, N+1):
for j in range(1, K+1):
if W[i] <= j:
dp[i][j] = max(V[i] + dp[i-1][j-W[i]], dp[i-1][j])
else:
dp[i][j] = dp[i-1][j]
print(dp[i][j])
j의 값이 1부터 K까지 증가되는데 이것은 활용 가능한 배낭의 용량이기 때문에 K만 넘지 않는 선에서 어떤 무게든 가능하다. 그러므로 점화식을 세워보면
1. 현재 물건의 가치 + 현재 물건의 무게를 제외하고 남은 배낭 공간에 넣는 물건들의 가치 => V[i] + dp[i-1][j-W[i]]
2. 전 물건까지의 가치(현재 물건을 넣지 않은 전까지의 물건들의 가치) => dp[i-1][j]
1과 2중에서 더 가치가 높은 것을 max로 골라서 dp에 담아준다.
단, if문을 사용해서 현재 넣는 물건의 무게가 배낭이 수용 가능한 무게를 넘으면 현재 물건을 넣지 못하고 이전 물건들만을 가지고 가치를 측정해야 한다.
반응형
'Algorithm > BAEKJOON' 카테고리의 다른 글
[백준] 2606번 바이러스 파이썬 (0) | 2022.03.02 |
---|---|
[백준] 1149번 RGB거리 파이썬 (2) | 2022.02.28 |
[백준] 2579번 계단 오르기 파이썬 (0) | 2022.02.21 |
[백준] 10172번 개 파이썬 (2) | 2022.02.20 |
[백준] 2839번 설탕 배달 파이썬 (0) | 2022.02.18 |