[TIL] WEEK03 - Knapsack

woo__j·2024년 4월 14일
0

TIL - Today I Learned

목록 보기
11/23
  1. Knapsack Problem
def knapsack():
    n, k = [int(x) for x in input().split()] #n: 물건 개수, k: 가방 무게
    table = [0] * (k+1) #테이블 세팅
    for _ in range(n):
        w, v = [int(x) for x in input().split()] #w: 무게, v: 가치
        for j in range(k, 0, -1):
            if j+w <= k and table[j] != 0: #테이블 범위 안에 있어야 하고, 값이 0이 아닐 때
                table[j+w] = max(table[j+w], table[j] + v)
        table[w] = max(table[w], v)
    print(max(table))

#점화식: table[i][j+w[i]]=max(table[i-1][j+w[i]], table[i-1][j]+v[i])
                            #기존의 값            #새로운 값
#knapsack()

def knapsack2():
    n, k = map(int, input().split())
    object_list = [[0, 0]]
    for _ in range(n):
        object_list.append(list(map(int, input().split())))
    dp = [[0]*(k+1) for _ in range(n+1)]
    for i in range(1, n+1):
        for j in range(1, k+1):
            weight = object_list[i][0]
            value = object_list[i][1]
            if j < weight: #가방에 넣을 수 없음 (j = 가방 남은 공간, weight = 물건 무게)
                dp[i][j] = dp[i-1][j] #위에 값 그대로 가져오기
            else: # 가방에 넣을 수 있음
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight]+value)
    print(dp[n][k])

knapsack2()

0개의 댓글

관련 채용 정보