일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- lazy evaluation
- 최장공통부분수열
- Python
- 그래프 탐색
- 최장공통부분문자열
- dfs
- 정처기 필기
- 냅색 알고리즘
- 다이나믹 프로그래밍
- bfs
- 클래스
- Docker 원리
- 배낭 문제
- 모듈러 연산 분배법칙
- 문자열
- 너비 우선 탐색
- 나는 바보야...
- 구현
- 파이썬
- db replication
- 일단 시도
- Container vs VM
- error:0308010C:digital envelope routines::unsupported
- 깊이 우선 탐색
- 동적 계획법
- 그래프 이론
- 그래프탐색
- npm start
- LCS 알고리즘
- 수학
Archives
- Today
- Total
Save my data
백준 12865 : 평범한 배낭 (파이썬) 본문
import sys
N, K = map(int, sys.stdin.readline().split())
dp = [[0] * (K + 1) for _ in range(N + 1)]
for i in range(1, N + 1):
w, v = map(int, sys.stdin.readline().split())
for j in range(1, K + 1):
if j >= w: # 1
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w] + v) # 2
else: # 3
dp[i][j] = dp[i - 1][j] # 4
print(dp[N][K])
코드를 보면서 적어놓는게 나중에 더 이해가 쉬울 것 같아서 코드블럭을 앞으로 빼 두었다.
- 만약 현재 내가 들 수 있는 무게가 j 일 때 넣으려는 물건의 무게 w 까지 충분히 들 수 있다면,
- 이전 것만 넣고 현상유지 할 것인지, 이전것을 유지하면서 지금것도 넣을건지 결정한다. 왜냐하면 무게 제한이 있기 때문에 가치가 같을 때 되도록이면 안 넣는게 유리하기 때문이다.
- 이전 것을 넣는데 오히려 w 를 빼는 이유 :
- 여유 공간이 j 라는 어떤 양 인데 거기서 w 만큼을 뺀다 == w 만큼 넣었다고 가정하는것이다.
- 왜 넣었는데 + 가 아니고 - 를 쓸까?
- 여유 공간에 어떤 물건을 넣었으니, 여유 공간 j 에서 넣은 물건의 양 만큼인 w 를 빼는것이다.
- 즉 j - w 는 j 에 w 만큼 넣었을 때 남은 공간
- j + w 라는 계산을 하게 되면 배낭에 원래 w 가 있던 상태에서 w 를 도로 빼버린다는 의미이다.
- 저 부분을 한글로 풀어서 정리하면...
- max(
현상 유지, w 만큼을 더 넣은 무게일 때의 가치 + 지금 물건의 가치
) - 위는 결국 현상 유지를 할 것인지, dp[j - w] 만큼의 여유가 있었을 때 했던 최선의 선택에 지금 물건의 가치를 합친 것과 비교한다는 의미이다.
- max(
- 이전 것을 넣는데 오히려 w 를 빼는 이유 :
- 남은 여유 무게가 j 인데 넣으려는 물건의 무게 w 가 그를 넘어버린다면,
- 더 이상 공간이 없으므로 현상 유지밖에 방법이 없다.
'알고리즘 > 백준' 카테고리의 다른 글
백준 10811 : 바구니 뒤집기 (파이썬) (0) | 2023.02.27 |
---|---|
백준 9251 : LCS (파이썬) (0) | 2023.02.24 |
백준 11052 : 카드 구매하기 (파이썬) (0) | 2023.02.24 |
백준 10815 : 숫자 카드 (파이썬) (0) | 2023.02.20 |
백준 1904 : 01타일 (파이썬) (0) | 2023.02.20 |
Comments