[Baekjoon] 12865 평범한 배낭 (python)

j-ij-i·2022년 12월 14일
1

알고리즘 문제풀이

목록 보기
8/10

문제 링크

link 📃 

문제 풀이

  • dp문제의 가장 기본적인 문제라 오랜만에 다시 풀었다.
  • n은 주어지는 물건의 갯수, k는 넣을 수 있는 최대 무게였고 무게배열 w[n+1], 가치배열 v[n+1]를 두고 dp[n+1][k+1]만큼의 dp 배열을 만들어주었다.
  • 총 for 문이 2개가 돌면서 가장 큰 가치를 넣는 dp배열을 만들었고 마지막에 dp[n][k]를 return하면 완료하도록 짰다.
  • 첫번째 for문은 n(물건의 갯수)까지 증가시킨다. 물건 배열을 입력때 받았던 순서대로 증가시킨다.
  • 두번째 for문은 k(무게)까지 증가시키면서 넣을 수 있는 무게에 따른 가치 값을 넣어준다.
  • 따라서 dp[1][7] 이면 첫번째 물건만 파악했을때 7의 무게까지 가질수 있는 dp의 값에 가장 큰 가치를 넣는다.
  • 만약 현재 넣는 물건이 고려하는 무게가 클 경우는 그 물건을 넣기 전의 가치 값을 넣어준다. 따라서 dp[i-1][j]가 된다.
  • 그렇지 않을 경우는 2가지를 비교해서 넣으면 되는데,
    1. (dp[i][지금 가질 수 있는 최대 무게 - 현재 그 물건의 무게] + 현재 물건의 가치)
    2. 현재 물건을 안넣고 이전 물건까지 고려했을 떄의 가치 => dp[i-1][j]
  • 두 가지를 고려하여 큰 값을 dp[i][j]에 넣는 방식으로 진행한다.

해결 코드

Python

n, k = map(int, input().split())

w = [0 for _ in range(n+1)]
v = [0 for _ in range(n+1)]
dp = [[0 for _ in range(k+1)]for _ in range(n+1)]

for i in range(1,n+1):
    w[i], v[i] = map(int, input().split())
    
for i in range(1,n+1):
    for j in range(1, k+1):
        if w[i] > j:
            dp[i][j] = dp[i-1][j]
        else:
            dp[i][j] = max( (dp[i-1][j-w[i]] + v[i]), dp[i-1][j])
            
print(dp[n][k])
profile
안녕하세요, 프론트엔드를 좋아하는 개발자 jiji입니다.

0개의 댓글