IT STUDY LOG
[Python] 백준 12865: 평범한 배낭 본문
# 문제 내용
12865번: 평범한 배낭
첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)
www.acmicpc.net
# 알고리즘 분류
# 풀이
import sys
input = sys.stdin.readline
# 물품 수, 버틸 수 있는 무게
n, k = map(int, input().split())
data = [[0,0]]
for _ in range(n):
# w(무게), v(가치) 순으로 추가
data.append(list(map(int, input().split())))
# 행 : 물건 개수 (n), 열 : 가방 무게 (k) 인 2차원 배열 dp
# 물건 개수 * 가방 무게
# 1) 현재 물건이 해당 열 무게보다 많이 나가면 담을 수 없음
# 2-1) 현재 물건이 해당 열 무게보다 덜 나가면 담을 수 있음
# 2-2) 2-1에서 구한 무게와 [이전물건][현재무게]를 비교해 더 큰 값으로 채움
dp = [[0] * (k+1) for _ in range(n+1)]
for num in range(1, n+1):
for weight in range(1, k+1):
# 물건 개수만큼 하나하나씩 순회
w, v = data[num]
# 현재 측정 중인 무게가 확인 중인 물건 무게보다 무거울 경우 (담을 수 있는 경우)
if weight >= w:
# 확인 중인 물건의 개수와 현재 무게 위치일 때 가치값을
# 이전 물건 개수에서 현재 무게 위치일 때 가치 값 vs 이전 물건 개수에서 (현재 무게 - 확인 중인 물건 무게) 위치에 확인중인 물건 가치 값을 더한 값 중 큰 값
dp[num][weight] = max(dp[num-1][weight], dp[num-1][weight-w] + v)
else:
# 담을 수 없으므로 이전 개수의 가치값을 그대로 입력
dp[num][weight] = dp[num-1][weight]
print(dp[n][k])
# References
https://claude-u.tistory.com/208
#159 백준 파이썬 [12865] 평범한 배낭 - 냅색 알고리즘
https://www.acmicpc.net/problem/12865 #Solution https://huiyu.tistory.com/entry/DP-01-Knapsack%EB%B0%B0%EB%82%AD-%EB%AC%B8%EC%A0%9C 참조하였음. 유명한 냅색 문제, 냅색 알고리즘이다. 간단하게 말하면, 한 도둑이 훔치는 배낭
claude-u.tistory.com
'computer science > coding test' 카테고리의 다른 글
[MySQL] 프로그래머스: 평균 일일 대여 요금 구하기 (0) | 2023.05.03 |
---|---|
[JAVA] 프로그래머스: K번째수 (0) | 2023.05.03 |
[MySQL] 프로그래머스: 12세 이하인 여자 환자 목록 출력하기 (0) | 2023.04.26 |
[JAVA] 프로그래머스: 더 맵게 (0) | 2023.04.26 |
[Python] 백준 12851번: 숨바꼭질2 (0) | 2023.04.25 |
Comments