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
- 백준 17779
- 프로래머스
- java 기술면접
- 백준
- 백준 17626
- Coroutine
- Spring Boot
- 백준 16235
- 프로그래머스
- spring security
- spring oauth
- sql 기술면접
- springboot
- re.split
- Spring
- 백준 16236
- 백준 16719
- 백준 19238
- spring cloud
- 파이썬
- 웹어플리케이션 서버
- JVM
- MSA
- JPA
- 백준 15685
- Kotlin
- MySQL
- java
- with recursive
- 백준 파이썬
Archives
- Today
- Total
시작이 반
[백준] 12865번(python 파이썬) 본문
SMALL
knapsack알고리즘 문제이다.
1. 배낭에 물건을 넣는다.
- 물건을 넣기전 상태에서 (가방 무게 - 해당 물건 무게)의 가치 + 해당 물건 가치
2. 배낭에 물건을 넣지 않는다.
- 이전 값을 그대로 사용한다.
ex)
물건 개수 : 4
가방에 들어갈 수있는 최대 무게 : 7
1번 물건 : 6 13
2번 물건 : 4 8
3번 물건 : 3 6
4번 물건 : 5 12
dp[i][j]
1. 물건을 넣는다 : dp[i-1][j - 해당 물건 무게] + 해당 물건 가치
2. 물건을 넣지 않는다 : dp[i-1][j]
1, 2중 최대값을 넣는다.
가방무게 물건 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
1번 물건 | 0 | 0 | 0 | 0 | 0 | 0 | 13 | 13 |
2번 물건 | 0 | 0 | 0 | 0 | 8 | 8 | 13 | 13 |
3번 물건 | 0 | 0 | 0 | 6 | 8 | 8 | 13 | 14 |
4번 물건 | 0 | 0 | 0 | 6 | 8 | 12 | 13 | 14 |
그런데 1차원 배열로도 풀 수 있다.
해당 배열을 n번 반복한다 했을때
n-1번째는 이전 상태이기 때문 또한 배열의 맨 마지막부터 해당 물건의 무게 까지 반복한다.(역순으로 채운다)
ex)
초기배열 dp
0 | 0 | 0 | 0 | 0 | 0 | 0 |
n = 0
1번째 물건 선택
dp
0 | 0 | 0 | 0 | 0 | 0 | 13 | 13 |
n = 1
1~2번째 물건 선택
dp
0 | 0 | 0 | 0 | 8 | 8 | 13 | 13 |
n = 2
1~3번째 물건 선택
dp
0 | 0 | 0 | 6 | 8 | 8 | 13 | 14 |
n = 3
1~4번째 물건 선택
dp
0 | 0 | 0 | 6 | 8 | 12 | 13 | 14 |
n, k = map(int, input().split())
item = list()
for _ in range(n):
item.append(tuple(map(int, input().split())))
##################
# 1차원 배열 풀이
dp2 = [0] * (k+1)
for i in range(n):
for j in range(k, item[i][0]-1, -1):
dp2[j] = max(dp2[j], dp2[j-item[i][0]] + item[i][1])
print(dp2[k])
##################
##################
# 2차원 배열 풀이
dp = [[0] * (k + 1) for _ in range(n)]
for i in range(n):
for j in range(k + 1):
if i == 0:
if item[i][0] <= j:
dp[i][j] = item[i][1]
else:
if j - item[i][0] < 0:
dp[i][j] = dp[i - 1][j]
else:
dp[i][j] = max(dp[i - 1][j - item[i][0]] + item[i][1], dp[i - 1][j])
print(dp[n - 1][k])
##################
LIST
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1931번 (python 파이썬) (0) | 2021.02.28 |
---|---|
[백준] 11047번 (python 파이썬) (0) | 2021.02.27 |
[백준] 1912번(python 파이썬) (0) | 2021.02.26 |
[백준] 9251번(python 파이썬) (0) | 2021.02.26 |
[백준] 2565번(python 파이썬) (0) | 2021.02.25 |