• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

안녕하세요 선생님. 코드 질문이 있어서 질문 남겨봅니다.

23.02.15 18:24 작성 조회수 166

0

선생님께서 풀어주신 dp 1차원 테이블 코드 말고도 2차원 dp 테이블로 풀어보았는데 해당 코드가 어떤 문제가 있는지 모르겠습니다.

import sys
sys.stdin = open("input.text", "rt")
input = sys.stdin.readline
sys.setrecursionlimit(10**6)

data = []
n, limit = map(int, input().split()) #보석 종류, 무게 한계값
for _ in range(n):
    a,b = map(int, input().split())
    data.append((a,b)) #무게, 가치
data.insert(0,(0,0)) #0번 인덱스 사용안함
dp = [[0] * (limit+1) for _ in range(n+1)]

for i in range(1,n+1):
    for j in range(1,limit + 1):
        weight = data[i][0] # 현재 물건 무게
        value = data[i][1] # 현재 물건 가치

        if j < weight: #현재 물건 담을 수 없으니 이전꺼 가져와야함
            dp[i][j] = dp[i-1][j]
        else: #현재 물건 담을 수 있음
            dp[i][j] = max(dp[i-1][j-weight] + value, dp[i-1][j])

print(dp[n][limit])

해당 문제를 백준 배낭 냅색 알고리즘 문제에 제출하면 100점이 뜨는데 여기 문제에 예시를 출력해보면 28이 아닌 26이 나옵니다.. 어떤 것이 문제인지 모르겠고

 

dp 2차원을 최적화해서 1차원으로 만든 것인데 문제가 어디 부분인지 감이 안옵니다.

 

미리 답변 감사합니다 !

 

답변 1

답변을 작성해보세요.

0

안녕하세요^^

위에 코드처럼 2차원으로 하면 한 종류의 보석을 2개 이상 가방에 담을 수 없는 코드입니다.

위에 코드는 한 종류의 보석을 딱 하나만 가방에 넣는 코드입니다. 즉 문제의 입력예시로 보면 3g짜리 보석을 2개 담아야 하는데 위에 코드는 1개만 담는 경우만 계산하고 있습니다.

dp[i-1][j-weight]값은 i-1번 보석까지 적용되어 있고, i번 보석은 적용되지 않은 값이라는 것을 생각해보세요.