1. 0-1 Knapsack


풀이 방법

  • 문제 상황 : 배낭의 최대 용량 W, 보석이 N개 있는데, 각 보석의 무게와 가격을 알고 있다. 배낭에 담을 수 있는 최대의 보석 가격의 합 구하시오.
  • DP를 사용
    • 2차원 배열 사용 : r : 보석 번호 0 ~ N, c : 최대 용량 0 ~ W
    • i번째 보석을 담을 때, i번째 보석을 담지 않을 때 중 max를 선택
  • Greedy로 풀이 불가능
  • 코드

      def knapsack(W, wt, val, n): # W: 배낭의 무게한도, wt: 각 보석의 무게, val: 각 보석의 가격, n: 보석의 수
          dp = [[0 for x in range(W+1)] for x in range(n+1)]
          for i in range(n+1): # 보석
              for w in range(W+1): # 무게 한도
      			# 0번째 행/열은 0
                  if i == 0 or w == 0 : dp[i][w] = 0
      			# i번째가 무게 한도보다 적음
      			# i번째 넣는 경우 : i 가격 + (i - 1)까지 썼을 때 (무게 한도 - i의 무게)까지의 최대 가격
      			# i번째 안넣는 경우 : w 무게 제한 내에서 i-1까지 범위 내에서 이용해서 담는 경우
                  elif wt[i] <= w : dp[i][w] = max(val[i]+dp[i-1][w-wt[i]], dp[i-1][w])
      			# i번째가 무게 한도보다 무거움 -> 담는 것 아예 불가능
                  else : dp[i][w] = dp[i-1][w]
        
          return dp[n][W]
    


관련 문제



참고 자료



Leave a comment