12865번 평범한 배낭(다이내믹 프로그래밍)

다이내믹 프로그래밍 방법이 필요한 문제들은 처음엔 접근 방법이 막막하게 느껴지곤 합니다. DP 접근 풀이가 필요한 관련 유형의 문제들을 많이 다뤄 보도록 합시다.


백준) 평범한 배낭(12865번)

평범한 배낭

  • 문제 설명: 최대 k 무게만큼 넣을 수 있는 배낭에 가치를 넣을 수 있는 최대값을 구하시오.


문제 설명

문제에서 물품의 수(N)는 최대 100 입니다.
물건 각각에 대하여 물건을 배낭에 넣을지 말지, 모든 경우를 수행한다면, 이 방법의 시간복잡도는 다음과 같습니다.

  • Brute-Force 방법 시간복잡도: O(2^100)

하지만 이 방법으로는 시간안에 문제를 풀 수 없으므로 다이내믹프로그래밍 방법으로 문제를 풀어봅시다.

  • d[i][j]를 i번째 물건까지 고려하였을때, j 무게를 넣은 경우의 가치 최대값이라고 정의하여 봅시다.

d[i][j]를 다음과 같이 표현이 가능합니다. 이 방법의 시간 복잡도는 물건의 수(N), 최대무게(K)에 대하여 다음과 같습니다.

  • DP 시간복잡도: O(N*K)

  • d[i(물건)][j(무게)]=(최대 가치)
  • i번째 물건을 넣지 않을 때, d[i][j]=d[i-1][j]
  • i번째 물건을 넣을 때, d[i][j]=d[i-1][j-w[i]]+v[i]
  • 따라서, d[i][j]=max(d[i-1][j],d[i-1][j-w[i]]+v[i])

위의 점화식의 정의에 따라 Bottom-Up 방식으로 코드를 구현하여 보겠습니다.

구현 과정

d = [[0] * (k+1) for _ in range(n+1)]
for i in range(1,n+1):
  for j in range(1,k+1):
    d[i][j]=d[i-1][j]
    if j-w[i]>=0:
      d[i][j]=max(d[i][j], d[i-1][j-w[i]]+v[i])
print(d[n][k])

Kanpsack algorithm으로 널리알려진 문제입니다.
DP를 배울때 교과서적인 예시로 나오는 문제이므로 익혀두도록 합시다.

전체 구현 코드

import sys
def input(): return sys.stdin.readline().rstrip()

n,k = map(int,input().split())
temp = [list(map(int,input().split())) for _ in range(n)]
w,v = zip(*temp)
w = [0] + list(w)
v = [0] + list(v)
d = [[0] * (k+1) for _ in range(n+1)]
for i in range(1, n+1):
    for j in range(1, k+1):
        d[i][j] = d[i-1][j]
        if j-w[i] >= 0:
            d[i][j] = max(d[i][j],d[i-1][j-w[i]]+v[i])
print(d[n][k])


2021 의 게시글

NMF

NMF 음수미포함 행렬분해

PCA, EVD

PCA 주성분 분석(차원 축소)

15989번 1,2,3 더하기 4(다이내믹 프로그래밍)

다이내믹 프로그래밍 방법이 필요한 문제들은 처음엔 접근 방법이 막막하게 느껴지곤 합니다. DP 접근 풀이가 필요한 관련 유형의 문제들을 많이 다뤄보도록 합시다.

10942번 펠린드롬(다이내믹 프로그래밍)

다이내믹 프로그래밍 방법이 필요한 문제들은 처음엔 접근 방법이 막막하게 느껴지곤 합니다. DP 접근 풀이가 필요한 관련 유형의 문제들을 많이 다뤄보도록 합시다.

12865번 평범한 배낭(다이내믹 프로그래밍)

다이내믹 프로그래밍 방법이 필요한 문제들은 처음엔 접근 방법이 막막하게 느껴지곤 합니다. DP 접근 풀이가 필요한 관련 유형의 문제들을 많이 다뤄 보도록 합시다.

11066번 파일 합치기(다이내믹 프로그래밍)

다이내믹 프로그래밍 방법이 필요한 문제들은 처음엔 접근 방법이 막막하게 느껴지곤 합니다. DP 접근 풀이가 필요한 관련 유형의 문제들을 많이 다뤄보도록 합시다.

2차원 배열 유형 문제

삼성역량테스트에서 출제되는 코테문제들의 경우 2차원 배열을 특정한 기준을 통해 회전시키는 문제가 자주 출제됩니다.

Introducing Python 파이썬 정리(2)

Introducing Python 처음 시작하는 파이썬[2판] 을 읽으면서, 몇 가지 헷갈리거나 새롭게 알게된 문법, 함수, 메소드들을 정리하려고 합니다.

Introducing Python 파이썬 정리(1)

Introducing Python 처음 시작하는 파이썬[2판] 을 읽으면서, 몇 가지 헷갈리거나 새롭게 알게된 문법, 함수, 메소드들을 정리하려고 합니다.

Pipeline CPU(5)- Control Hazard

Pipeline-CPU 목차 Pipeline CPU(1) : Single-Cycle vs Multi-Cycle CPU Pipeline CPU(2) : Pipeline-CPU의 간략한 이해 Pipeline CPU(3) : Data Hazard(RAW...

Pipeline CPU(4)- Data Forwarding

Pipeline-CPU 목차 Pipeline CPU(1) : Single-Cycle vs Multi-Cycle CPU Pipeline CPU(2) : Pipeline-CPU의 간략한 이해 Pipeline CPU(3) : Data Hazard(RAW...

Pipeline CPU(3)- Data Hazard

Pipeline-CPU 목차 Pipeline CPU(1) : Single-Cycle vs Multi-Cycle CPU Pipeline CPU(2) : Pipeline-CPU의 간략한 이해 Pipeline CPU(3) : Data Hazard(RAW...

맨 위로 이동 ↑