일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 비지도학습
- pixelshuffle
- MDSR
- deeplearning
- AStar
- residualnetwork
- 증가하는부분수열
- PYTHON
- 딥러닝
- EDSR
- BFS
- leetcode
- 동적계획법
- NeuralNetwork
- DFS
- RESNET
- convolution
- 지도학습
- sr
- residuallearning
- SRCNN
- CNN
- 8puzzle
- Increasing Triplet Subsequence
- 합성곱
- a*
- 준지도학습
- 신경망
- superresolution
- Today
- Total
이것저것 코딩하는 블로그
[Algorithm] Knapsack Problem 본문
0. 문제
link: https://www.codetree.ai/missions/6/concepts/35/problems/dp-knapsack-2/introduction
도둑이 보석방을 털러 갔다고 하자.
(사견이지만 프로그래밍 문제에는 부도덕한 놈들이 많다..해킹하는 놈 터는 놈 등등..)
이 때 도둑 가방의 크기는 n이며, 이보다 더 무겁게 담을 수는 없다. 보석은 종류별로 단 하나씩만 있다.
도둑방에 있는 보석의 무게와 가격이 주어졌을 때, 도둑이 훔쳐올 수 있는 보석들의 가격의 합의 최대를 구하는 문제이다.
1. 풀이
이는 동적계획법으로 해결할 수 있다. dp[i][j]를 i번째 보석까지 고려했을 때, 무게가 j일 때 담을 수 있는 최대 보석의 양으로 설정한다.
i번째 보석을 선택하느냐 선택하지 않느냐가 관건이 될 것이다.
i번째 보석을 선택한 경우, 일단 i번째 보석을 넣었을 때 무게가 j인지를 검사해야 한다. 만약 넘는다면 넘어가야 한다.
넘지 않는다면, i-1번째 보석까지 고려했을 때 가방의 무게 합이 j-(i번째 보석의 무게) 일 때, 즉 dp[i-1][j-weight[i]] 에 i번째 보석을 넣었을 때의 가격이 dp[i][j]가 될 것이다. 이를 점화식으로 표현하면 다음과 같다.
dp[i][j] = dp[i-1][j-weight[i]] + value[i]
i번째 보석을 선택하지 않은 경우, dp[i][j]의 정의가 무게가 정확히 j일때의 값이므로 i-1번째 보석까지 고려했을 때 최댓값을 그대로 끌고 오면 될 것이다. 이를 점화식으로 표현하면 다음과 같다.
dp[i][j] = dp[i-1][j]
이 둘중 최댓값을 골라주면 된다. 이를 점화식으로 표현하면 다음과 같다.
dp[i][j] = max(dp[i-1][j-weight[i]] + value[i], dp[i-1][j])
2. 구현
weight = [3, 1, 4, 5, 2]
price = [4, 1, 2, 6, 3]
n = int(input())
dp = [[-1 for _ in range(n+1)] for _ in range(5)]
dp[0][0] = 0
dp[0][weight[0]] = price[0]
for i in range(1, 5):
for j in range(n+1):
if j - weight[i] >= 0 and dp[i-1][j-weight[i]] != -1:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + price[i])
else:
dp[i][j] = dp[i-1][j]
for i in range(5):
print(dp[i])
weight와 price가 주어진 경우로 했다. 만약 이를 다르게 하고 싶다면 그냥 입력받으면 된다.
dp의 초기화는 첫 번째 보석을 고려했을 때까지만 해준다. 이후의 값은 동적계획법으로 계산된다.
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[Algorithm] 숫자 암호 만들기 (password) (1) | 2021.10.12 |
---|---|
[Algorithm] Edit Distance (편집 거리) (0) | 2021.10.12 |
[Algorithm] LCS (Longest Common Subsequence) (0) | 2021.10.12 |
[Algorithm] 감소하는 부분 수열 (0) | 2021.10.12 |
[Algorithm] Bank Problem (동전 문제) (0) | 2021.10.12 |