Algorithm Problem/Python

[python] SWEA - 3282. 0/1 Knapsack

deo2kim 2020. 12. 17. 23:05
λ°˜μ‘ν˜•

πŸ€”λ¬Έμ œ ν•΄κ²°

  • D3 | DP( Knapsack )

πŸ’¨ λƒ…μƒ‰μ•Œκ³ λ¦¬μ¦˜

πŸ’¨ 각 μ•„μ΄ν…œμ— λŒ€ν•΄μ„œ κ°€λ°©μ˜ 크기λ₯Ό 0λΆ€ν„° 1μ”© μ΅œλŒ€λ¬΄κ²ŒκΉŒμ§€ λŠ˜λ €κ°€λ©° 계산.

πŸ’¨ κ°€λ°©μ˜ 크기가 ν•΄λ‹Ή μ•„μ΄ν…œμ˜ λ¬΄κ²Œλ³΄λ‹€ μž‘μœΌλ©΄ μ•„μ΄ν…œμ„ 넣지 λͺ»ν•œλ‹€. μ΄μ „κΉŒμ§€μ˜ λ¬΄κ²Œμ™€ κ°€μΉ˜ 적용

πŸ’¨ κ°€λ°©μ˜ 크기가 ν•΄λ‹Ή μ•„μ΄ν…œμ˜ λ¬΄κ²Œλ³΄λ‹€ 크면 μ•„μ΄ν…œμ„ 넣을지 말지 μ„ νƒν•œλ‹€.

πŸ’¨πŸ’¨ μ΄μ „κΉŒμ§€μ˜ λ¬΄κ²Œμ™€ κ°€μΉ˜ vs (μ΄μ „κΉŒμ§€μ˜ 무게 - ν˜„μž¬ μ•„μ΄ν…œμ˜ 무게)의 κ°€μΉ˜ + ν˜„μž¬ μ•„μ΄ν…œμ˜ κ°€μΉ˜

 

πŸ’»μ†ŒμŠ€ μ½”λ“œ

# μž…λ ₯
T = int(input())
Ns = []
for tc in range(T):
    N, K = map(int, input().split())
    items = [list(map(int, input().split())) for _ in range(N)]
    Ns.append((N, K, items))

# 풀이
results = []

for tc in range(T):
    N, K, items = Ns[tc]
    dp = [[0] * (K + 1) for _ in range(N + 1)]

    for i in range(1, len(dp)):
        v, c = items[i - 1]
        for j in range(1, len(dp[i])):
            # 가방에 μ•„μ΄ν…œμ΄ λ“€μ–΄ 갈 수 있으면
            if j >= v:
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v] + c)
            else:
                dp[i][j] = dp[i - 1][j]

    results.append(dp[-1][-1])

# 좜λ ₯
for tc in range(T):
    print(f'#{tc + 1} {results[tc]}')
 

πŸ“•λ¬Έμ œ 확인

좜처: SW Expert Academy

 

SW Expert Academy

SW ν”„λ‘œκ·Έλž˜λ° μ—­λŸ‰ 강화에 도움이 λ˜λŠ” λ‹€μ–‘ν•œ ν•™μŠ΅ 컨텐츠λ₯Ό ν™•μΈν•˜μ„Έμš”!

swexpertacademy.com

 

λ°˜μ‘ν˜•