Notice
Recent Posts
Recent Comments
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

No Limitation

[DP] 평범한 배낭 - 백준 본문

프로그래밍

[DP] 평범한 배낭 - 백준

yesungcho 2022. 2. 3. 19:48

https://www.acmicpc.net/problem/12865

 

12865번: 평범한 배낭

첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)

www.acmicpc.net

 

Knapsack 문제의 전형적인 예시다. 

 

메모이제이션을 이용하여 recursion을 통해 구현하였다. 

 

본 문제는 정석적인 문제라 형태를 외워놔도 좋을 것 같다. 

 

n, k = [int(x) for x in input().split()]

weight = []; value = []; dic = {};
for _ in range(n) :
    w, v = [int(x) for x in input().split()]
    weight.append(w)
    value.append(v)
    
def knapsack(k, n, memo={}) :
    if (k, n) in memo :
        return memo[(k,n)]
		### 모든 무게를 소진했거나 아이템을 소진한 경우
    if k == 0 or n == 0 :
        return 0
		## 무게가 넘어가는 경우
    if weight[n-1] > k :
				## 단순하게 물건 제거
        memo[(k,n)] = knapsack(k,n-1)
        return memo[(k,n)]
    else :
				### 무게를 실을 수 있는 경우, 실은 경우랑 그렇지 않은 경우랑 비교해서 최대값 넣음
        memo[(k, n)] = max(value[n-1]+knapsack(k-weight[n-1], n-1),knapsack(k,n-1))
        return memo[(k, n)]

print(knapsack(k,n))

 

'프로그래밍' 카테고리의 다른 글

[구현] 삼각 달팽이 - 프로그래머스  (0) 2022.02.04
[Greedy] 동전0 - 백준  (0) 2022.02.03
[DP] 설탕 배달 - 백준  (0) 2022.02.02
[DP] N으로 표현 - 프로그래머스  (0) 2022.02.02
[DP] 동전 1 - 백준  (0) 2022.02.02