백준 / 12865번 / 평범한 배낭 / python 파이썬

2024. 11. 12. 18:10·코딩테스트/백준 (python)

 

문제 : https://www.acmicpc.net/problem/12865

 

 

DP 점화식을 세우는 것이 어려워서 최근에 DP 문제만 풀고 있는데 아직 접근법을 떠올리기 힘든 것 같다.

 

dp[i]는 배낭의 최대 용량이 i일 때 얻을 수 있는 최대 가치를 의미한다.

dp[i - w] + v 은 무게 w인 아이템을 추가하여 무게 i가 되었을 때 새로운 최대 가치를 계산하는 부분이다.

max(dp[i], dp[i - w] + v)를 계산해, 현재 아이템을 넣었을 때와 넣지 않았을 때 중 최대 가치를 선택해 dp[i]를 갱신한다.

 

예를 들어 배낭의 최대 용량이 7일 때, 무게와 가치가 각각 (3, 4), (4, 5), (2, 3)인 아이템들이 있다면

  1. dp 테이블을 dp = [0] * (K + 1) # [0, 0, 0, 0, 0, 0, 0, 0]와 같이 초기화 한다. 

  2. 각 아이템에 대해 dp 배열을 갱신한다. 

    1) 첫 번째 아이템 (무게 3, 가치 4)

      배낭 용량 i=7부터 i=3까지 계산, dp[i] = max(dp[i], dp[i - 3] + 4)의 점화식을 적용

  • i=7: dp[7] = max(dp[7], dp[4] + 4) = max(0, 0 + 4) = 4
  • i=6: dp[6] = max(dp[6], dp[3] + 4) = max(0, 0 + 4) = 4
  • i=5: dp[5] = max(dp[5], dp[2] + 4) = max(0, 0 + 4) = 4
  • i=4: dp[4] = max(dp[4], dp[1] + 4) = max(0, 0 + 4) = 4
  • i=3: dp[3] = max(dp[3], dp[0] + 4) = max(0, 0 + 4) = 4

갱신 후 dp = [0, 0, 0, 4, 4, 4, 4, 4]

 

 

    2) 두 번째 아이템 (무게 4, 가치 5)

      배낭 용량 i=7부터 i=4까지 계산, dp[i] = max(dp[i], dp[i - 4] + 5)의 점화식을 적용

 

  • i=7: dp[7] = max(dp[7], dp[3] + 5) = max(4, 4 + 5) = 9
  • i=6: dp[6] = max(dp[6], dp[2] + 5) = max(4, 0 + 5) = 5
  • i=5: dp[5] = max(dp[5], dp[1] + 5) = max(4, 0 + 5) = 5
  • i=4: dp[4] = max(dp[4], dp[0] + 5) = max(4, 0 + 5) = 5

갱신 후 dp = [0, 0, 0, 4, 5, 5, 5, 9]

 

이와 같이 진행하면 배낭의 최대 용량을 넘지 않고 담을 수 있는 최대 가치를 찾을 수 있다.

 

 


 

정답

N, K = map(int, input().split())
dp = [0] * (K + 1)

for _ in range(N):
    w, v = map(int, input().split())
    for i in range(K, w - 1, -1):
        dp[i] = max(dp[i], dp[i - w] + v)
print(dp[K])

 

 

'코딩테스트 > 백준 (python)' 카테고리의 다른 글

백준 / 1927번 / 최소 힙 / python 파이썬  (0) 2024.11.22
백준 / 1766번 / 문제집 / python 파이썬  (0) 2024.11.17
백준 / 2156번 / 포도주 시식 / python 파이썬  (1) 2024.11.07
백준 / 2164번 / 카드2 / python 파이썬  (0) 2024.10.31
백준 / 14940번 / 쉬운 최단거리 / python 파이썬  (0) 2024.10.17
'코딩테스트/백준 (python)' 카테고리의 다른 글
  • 백준 / 1927번 / 최소 힙 / python 파이썬
  • 백준 / 1766번 / 문제집 / python 파이썬
  • 백준 / 2156번 / 포도주 시식 / python 파이썬
  • 백준 / 2164번 / 카드2 / python 파이썬
seulll
seulll
개인 공부 / 정리 블로그입니다
  • seulll
    seulll
    seulll
  • 전체
    오늘
    어제
    • 분류 전체보기 (338) N
      • 코딩테스트 (230) N
        • programmers (python) (156)
        • 백준 (python) (72) N
      • 자료구조 | 알고리즘 (14)
      • 개발 | 프로젝트 (43)
        • Python (4)
        • Java | Spring (7)
        • Android (5)
        • Unity (3)
        • API (4)
      • CS (15)
        • Network (5)
        • SQL (2)
        • OS (4)
      • 데이터 분석 (14)
      • 기타 (13)
  • 블로그 메뉴

    • 홈
    • 태그
    • 글쓰기
    • 설정
  • 링크

    • GitHub
  • 인기 글

  • 태그

    대입 표현식
    박스플롯
    Python
    카카오맵 api
    API
    코딩테스트
    그리디 알고리즘
    train_test_split
    티스토리챌린지
    백엔드
    바다코끼리
    confusion matrix
    프로그래머스
    데이터분석
    오블완
    모델 성능 평가
    solving environment
    오차행렬
    백엔드 개발자 역량
    파이썬
    카카오맵
    Boxplot
    kakao map api
    Greedy
    백엔드 개발자
    2 x n 타일링
    야근 지수
    웹크롤링
    프렌즈4블록
    asterisk
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
seulll
백준 / 12865번 / 평범한 배낭 / python 파이썬
상단으로

티스토리툴바