logseq 20260329
This commit is contained in:
parent
c5703f5b9b
commit
aa5a07b061
@ -14,15 +14,15 @@ deck:: Logseq/coding tip
|
||||
- id:: 69c7aa4b-2786-4234-ab56-b64506c9ae9e
|
||||
1. **Fractional Knapsack (분할 가능 배낭 문제):** 물건을 쪼갤 수 있는 경우 -> {{c1 그리디(Greedy) 알고리즘 :: 사용 알고리즘?}}으로 풀이
|
||||
|
||||
2. **0-1 Knapsack (0-1 배낭 문제):** 물건을 쪼갤 수 없는 경우 (넣거나/안 넣거나). -> {{c1 DP(동적 계획법)}}로 풀이
|
||||
2. **0-1 Knapsack (0-1 배낭 문제):** 물건을 쪼갤 수 없는 경우 (넣거나/안 넣거나). -> {{c1 DP(동적 계획법) :: 사용 알고리즘?}}로 풀이
|
||||
-
|
||||
- ### **0-1 배낭 문제의 DP 풀이 (2차원 배열)**
|
||||
- **상태 정의:** dp[i][w] = {{c1 i번째 물건까지 고려했을 때, 배낭의 임시 무게 한도가 w일 때 얻을 수 있는 최대 가치 :: 말로 풀어서 설명할 것!}}
|
||||
id:: 69c7a933-f266-4fb2-b2a1-d384d24c47b4
|
||||
- **점화식 (가장 중요!):**
|
||||
- ▶︎ 현재 물건의 무게가 w보다 커서 배낭에 못 넣을 때: dp[i][w] = {{c1 dp[i-1][w]}} ▶︎ 넣을 수 있을 때 : dp[i][w] = {{c1 max(dp[i-1][w], dp[i-1][w - weight[i]] + value[i])}}
|
||||
extra:: 즉, 이전 물건까지의 최적해를 그대로 가져오거나, 현재 물건을 넣기 위해 배낭 공간을 비웠을 때의 최적해에 현재 가치를 더한 것 중 더 큰 값을 선택한다냥!
|
||||
id:: 69c7a933-c467-408c-856b-2b7ad4197e51
|
||||
extra:: 즉, 이전 물건까지의 최적해를 그대로 가져오거나, 현재 물건을 넣기 위해 배낭 공간을 비웠을 때의 최적해에 현재 가치를 더한 것 중 더 큰 값을 선택한다.
|
||||
- **시간/공간 복잡도:** {{c1 $O(N * W)$}} (N: 물건 개수, W: 배낭의 최대 무게)
|
||||
id:: 69c7a933-5096-444e-9c15-8ca2b16936d9
|
||||
- **코드**
|
||||
@ -32,7 +32,7 @@ deck:: Logseq/coding tip
|
||||
W : 배낭의 최대 용량
|
||||
N : 물건의 갯수
|
||||
weight : i번째 물건의 무게를 나열한 배열(N+1 크기의 배열로 인덱스 1번부터 N번까지 값이 들어가있음)
|
||||
value : i번째 물건의 가치를 나열한 배열((N+1 크기의 배열로 인덱스 1번부터 N번까지 값이 들어가있음))
|
||||
value : i번째 물건의 가치를 나열한 배열(N+1 크기의 배열로 인덱스 1번부터 N번까지 값이 들어가있음)
|
||||
|
||||
위 매개변수를 입력으로 받는 2차원 배열을 이용해 가장 배낭문제를 푸는 파이썬 함수(knapsack_2d)를 작성하라 #card
|
||||
- ```python
|
||||
@ -44,9 +44,9 @@ deck:: Logseq/coding tip
|
||||
for i in range(1, N + 1):
|
||||
for w in range(1, W + 1):
|
||||
# 1. 현재 물건의 무게가 배낭 용량보다 작거나 같아서 '넣을 수 있는' 경우
|
||||
if weight[i-1] <= w:
|
||||
if weight[i] <= w:
|
||||
# (넣는 경우의 가치) vs (안 넣는 경우의 가치) 중 최댓값
|
||||
dp[i][w] = max(value[i-1] + dp[i-1][w - weight[i-1]], dp[i-1][w])
|
||||
dp[i][w] = max(value[i] + dp[i-1][w - weight[i-1]], dp[i-1][w])
|
||||
# 2. 물건이 너무 무거워서 '못 넣는' 경우
|
||||
else:
|
||||
# 이전 물건까지의 최적해를 그대로 가져옴
|
||||
@ -76,7 +76,7 @@ deck:: Logseq/coding tip
|
||||
W : 배낭의 최대 용량
|
||||
N : 물건의 갯수
|
||||
weight : i번째 물건의 무게를 나열한 배열(N+1 크기의 배열로 인덱스 1번부터 N번까지 값이 들어가있음)
|
||||
value : i번째 물건의 가치를 나열한 배열((N+1 크기의 배열로 인덱스 1번부터 N번까지 값이 들어가있음))
|
||||
value : i번째 물건의 가치를 나열한 배열(N+1 크기의 배열로 인덱스 1번부터 N번까지 값이 들어가있음)
|
||||
|
||||
위 매개변수를 입력으로 받는 2차원 배열을 이용해 가장 배낭문제를 푸는 파이썬 함수(knapsack_1d)를 작성하라 #card
|
||||
- ```python
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user