Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- python
- Basic
- dfs
- guide
- Algorithm
- String
- Tutorial
- 파이썬
- parameter
- c++
- 문제풀이
- 오류
- 기초
- 시작해요 언리얼 2022
- dynamic
- Unreal Engine 5
- Material
- loop
- 프로그래밍
- DP
- github
- UE5
- C#
- Programming
- 재귀
- Class
- W3Schools
- 백준
- w3school
- Unity
Archives
- Today
- Total
행복한 개구리
백준 22.03.01. 12865번 - 평범한 배낭 본문

n, k = map(int, input().split())
obj = [[0, 0]]
dp = [[0]*(k+1) for _ in range(n+1)]
for i in range(n):
obj.append(list(map(int, input().split())))
for i in range(1, n+1):
for j in range(1, k+1):
wei = obj[i][0]
val = obj[i][1]
if j < wei:
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-wei]+val)
print(dp[n][k])

- dp는 위 사진과 같은 결과를 갖습니다.
- 우선 물건들을 저장할 리스트에 0무게의 0가치를 갖는(비어잇는) 요소를 하나 만들어줍니다.
- 그리고 모든 물건들을 반복문을 통해 추가해줍니다.
- 우선 dp는 허용된 모든 무게와 기준으로 삼을 물품마다의 최고 가치를 기록하기 위해서 허용된 무게만큼의 길이를 갖는 리스트를 물품의 개수만큼 갖습니다.
- [[0]*(k+1) for _ in range(n+1)]
- 각 품목별로 무게를 비교해가며 dp를 채워나갈 것입니다.
- 이미 들어가있는 물품의 무게와 추가할 물품의 무게가 허용된 무게를 초과한다면
- 1. 이미 있던 물건을 포기하거나
- 2. 물건을 추가하지 않는 두가지 방법이 있습니다.
- 이것을 if j < wei 조건문으로 걸러내어 만약 이 조건에 부합한다면 이전에 가장 큰 값을 가졌던 값을 계승합니다.
- 만약 그렇지 않다면 물건을 그대로 갖는것과 추가하는 것 중 큰 값어치를 갖는 것을 dp[i][j]에 기록합니다.
- 이 과정을 모두 거치고나면 dp의 제일 마지막 요소에 최댓값이 기록되므로 이것을 출력합니다.
'Algorithm > BaekJoon' 카테고리의 다른 글
백준 22.03.05. 1931번 - 회의실 배정 (0) | 2022.03.05 |
---|---|
백준 22.03.02. 11047번 - 동전 0 (0) | 2022.03.02 |
백준 22.02.28. 1912번 - 연속합 (0) | 2022.02.28 |
백준 22.02.28. 9251번 - LCS (0) | 2022.02.28 |
백준 22.02.22. 2565번 - 전깃줄 (0) | 2022.02.22 |