-
Notifications
You must be signed in to change notification settings - Fork 2
19-mj010504 #70
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
19-mj010504 #70
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DPλ₯Ό μ°μ΅ν μ μλ μ’μ λ¬Έμ λ€μ.
μΌλ¨ N=40μ΄λΌμ μμ νμμ λΆκ°λ₯νκ³ κ·Έλ¦Όμ λͺ κ° κ·Έλ €λ³΄λ DFSλ‘ μ²λ¦¬κ° λ κ±° κ°μμ΅λλ€. κ·Έλ¬λ λ¨μ DFSλ‘λ§ νλ©΄ μμ μκ° μ΄κ³Όμ΄λ―λ‘ μ¬κΈ°μ λ©λͺ¨μ΄μ μ΄μ μ μ¬μ©ν΄μ μ΅μ νλ₯Ό ν΄μΌν κ±° κ°μμ΅λλ€. (14μ£Όμ°¨ PRμμμ κ²½νμ΄ λμμ΄ λμμ΅λλ€.)
κ·Έλ°λ° μνλ₯Ό μ΄λ»κ² μ μν΄μΌν μ§ λλ¬΄μ§ μκ°μ΄ λμ§ μμμ΅λλ€. λκ° λ°°λ λ¬Έμ κ°μ λλμ΄κΈ΄ νλ° Aμ B λ κ°μ κ²½μ°λ₯Ό λͺ¨λ κ³ λ €ν΄μΌνλ μ΄λ €μ μ΅λλ€.
κ·Έλμ μλ μ€λͺ μ μ κ° μκ°ν κ² μλ ChatGPTλ₯Ό μ°Έκ³ ν¨μ λ°νλλ€.
μ νμ
-
μμ:
$dp[0][0] = 0$ , λλ¨Έμ§λ INF(=$m$ μ΄μ)λ‘ μ±μ -
μ μ΄(물건
$i$ μ μ 보κ°$(a_i, b_i)$ μΌ λ):-
$i$ λ₯Ό Aκ° νμΉλ©΄:$dp[i+1][a + a_i] = min(dp[i+1][a + a_i], dp[i][a])$ -
$i$ λ₯Ό Bκ° νμΉλ©΄:$dp[i+1][a] = min(dp[i+1][a], dp[i][a] + b_i)$
-
-
λ²μ/κ°μ§μΉκΈ°:
- Aλ
$a < n$ λ§ μ μ§ ($a$ κ°$n$ μ΄μμ΄λ©΄ Aκ° μ‘νλ―λ‘ λ²λ¦Ό) - Bλ κ°μ΄
$m$ μ΄μμ΄λ©΄ λ λ³Ό νμ μμ(μ‘ν) β κ°±μ μ€ν΅
- Aλ
-
μ΅μ’
λ΅ :
$i = N$ μμ$a = 0..n-1$ μ€$dp[N][a] < m$ μΈ κ°μ₯ μμ$a$ - μμΌλ©΄ : -1
μν νΈλ¦¬
- μμ κ° :
info = [(1,2), (3,1), (2,2)], n=5, m=4 - λ
Έλ λΌλ²¨:
(i, a) [μ΅μ Bν©]
(0,0)[0]
ββ A:+1 β (1,1)[0]
β ββ A:+3 β (2,4)[0]
β β ββ A:+2 β (3,6)[0] β μ»· (a=6β₯5)
β β ββ B:+2 β (3,4)[2] β ν보
β ββ B:+1 β (2,1)[1]
β ββ A:+2 β (3,3)[1] β ν보
β ββ B:+2 β (3,1)[3] β ν보
ββ B:+2 β (1,0)[2]
ββ A:+3 β (2,3)[2]
β ββ A:+2 β (3,5)[2] β μ»· (a=5β₯5)
β ββ B:+2 β (3,3)[4] β μ»· (b=4β₯4)
ββ B:+1 β (2,0)[3]
ββ A:+2 β (3,2)[3] β ν보
ββ B:+2 β (3,0)[5] β μ»· (b=5β₯4)- 리νλ
$i=3$ (λͺ¨λ 물건 μ²λ¦¬)μΈ λ Έλλ€. - μ΄μλ¨μ 리νλ€μ
$(a, b)$ λ:
(3,4)[2], (3,3)[1], (3,1)[3], (3,2)[3] - μ¬κΈ°μ
$b < m(=4)$ μ λ§μ‘±νλ 리νλ€ μ€$a$ κ° μ΅μμΈ κ² λ΅ β$a=1$ μ΄ μ΅μκ°.
μ½λ
def solution(info, n, m):
INF = int(1e9)
N = len(info)
capA = min(n-1, 3*N) # A νμ ν© μν
# dp[i][a] = μμμ iκ° μ²λ¦¬νκ³ ,
# Aμ λμ νμ μ΄ aμΌ λ λ¬μ± κ°λ₯ν Bμ νμ μ΅μ ν©
dp = [[INF for _ in range(capA + 1)] for _ in range(N + 1)]
dp[0][0] = 0
for i in range(N):
a_i, b_i = info[i][0], info[i][1]
for a in range(capA + 1):
if dp[i][a] >= INF:
continue
# iλ₯Ό Aκ° νμΉλ κ²½μ°
na = a + a_i
if na < n and na <= capA:
dp[i + 1][na] = min(dp[i + 1][na], dp[i][a])
# iλ₯Ό Bκ° νμΉλ κ²½μ°
nb_sum = dp[i][a] + b_i
if nb_sum < m:
dp[i + 1][a] = min(dp[i + 1][a], nb_sum)
answer = INF
for a in range(capA + 1):
if dp[N][a] < m:
answer = min(answer, a)
return answer if answer != INF else -1μκ°
μ κ° λ¬Έμ νμ΄μ μ΄λ €μμ λκΌλ μ΄μ λ νμ¬
λ, νμ μ λ²μκ° μ΅λ 3μ΄λΌλ κ²λ ν° ννΈμλλ° λ§μ½ 3λ³΄λ€ λ ν¬λ€λ©΄ dp λ°°μ΄μ ν¬κΈ°λ λ 컀μ§κΈ° λλ¬Έμ ν μ μμΌλ―λ‘ μ΄λ λ¬Έμ μ μμκ° μλν λΆλΆμ΄λΌ λ³Ό μ μμ΅λλ€.
DP λ¬Έμ λ₯Ό ν λ, μ΄λ€ λ³μλ₯Ό μΆμΌλ‘ μΌμ κ²μΈκ°(DP ν
μ΄λΈμ μ΄λ€ λ³μλ₯Ό κΈ°μ€μΌλ‘ λ°°μ΄μ μ°¨μμΌλ‘ μΌλλ)λ₯Ό μ ν λ, μ μ½μ΄ μ μ μͺ½μ μΆμΌλ‘ μΌλ κ²μ΄ μ’λ€κ³ ν©λλ€.
μ΄ λ¬Έμ μμλ
- A μ μ½: Aμ νμ ν©
$< n$ - B μ μ½: Bμ νμ ν©
$< m$
μ΄ λλλ° μ΄ λ¬Έμ λ λ μ μ½μ ν¬κΈ°κ° κ°μΌλ―λ‘ μ΄λ μͺ½μ μΆμΌλ‘ μ‘μλ λΉμ·νκ² ν립λλ€.
κ°λ¨ν ν리λ DP λ¬Έμ μλ λ¬λ¦¬ μ νμ μ°ΎκΈ°λΆν° μμν΄μ λ²μ λ± μ κ²½μ¨μΌ ν μ μ΄ λ§μ λ¬Έμ μΈ κ±° κ°μ΅λλ€. λμ€μ λ°λ‘ ν΄μ€ λ³΄μ§ μκ³ μ€μ€λ‘λ ν λ² νμ΄λ΄μΌκ² μ΅λλ€.
λ―Όμ€ λ νμ΄μ²λΌ DFS + λ©λͺ¨μ΄μ μ΄μ μΌλ‘λ ν μ μκ³ λ€λ₯Έ μ¬λλ€ νμ΄λ₯Ό μ΄ν΄λ³΄λ μ€ κ·Έλ¦¬λλ‘λ ν μ μλ κ² κ°μ΅λλ€. (νμ€νμ§λ μμ΅λλ€) λμ€μ λ€μ ν λλ λ€λ₯Έ νμ΄λ²μΌλ‘λ νμ΄λ΄μΌκ² μ΅λλ€.
μ’μ λ¬Έμ μμ΅λλ€. μκ³ νμ ¨μ΅λλ€!
|
μ λ DPλ DFS μ€ μ΄λ€ λ°©λ²μ μ¬μ©ν κΉ νλ€κ°, DPλ₯Ό μ¬μ©νλ©΄ λ μ λ¬Έμ λΉμ€λ¬΄λ¦¬νκ² νμ΄κ° λ€μ΄κ° κ² κ°μμ ν μ μ κ³ DFS + κ²½λ‘ λ©λͺ¨μ΄μ μ΄μ λ°©λ²μ μ ννμ΅λλ€. λ μμ μκ³ λ¦¬μ¦μ μμλ μμ λκΈ°κ° λ¬΄μλ€μ.. κ²½λ‘ λ©λͺ¨μ΄μ μ΄μ μμ΄λμ΄λ 3μ°¨μ intν dpλ₯Ό μ μΈν΄μ€ ν, [물건 μΈλ±μ€] [A νμ κ°μ] [B νμ κ°μ] μΈλ±μ€μ A νμ κ°μ μ 보λ₯Ό λ΄μμ΅λλ€. μΈλ±μ€λ₯Ό μ¦κ°μμΌ μ£Όλ©΄μ Aκ° νμΉ κ²½μ°, Bκ° νμΉ κ²½μ° 2κ°μ§ κ²½μ°μ λν λ°©ν₯μΌλ‘ μ¬κ· κΉμ΄λ₯Ό μ¦κ°μν€κ³ , κΈ°μ 쑰건μ λΏμ΄λ©΄ νμ¬ A νμ κ°μ returnν©λλ€. κ·Έλ¦¬κ³ 2κ° λ°©ν₯μ μ¬κ· μ°μ°μ΄ λλλ©΄, λ κ°λ€ μ€ λ μμ κ°μ dp[νμ¬ λ¬Όκ±΄ μΈλ±μ€][A][B]μ μ μ₯νλ λ°©μμ μ¬μ©νμ΅λλ€. μ μΆ μ½λμ λλ€. μμ λ²μ£/c++#include <bits/stdc++.h>
using namespace std;
int amax, bmax;
vector<vector<int>> v;
int dp[101][101][101];
int solve(int i, int a, int b) {
// Aλ Bκ° μκ³μΉ μ΄μμ΄λ©΄ κ°μ§μΉκΈ°
if (a >= amax || b >= bmax) return INT_MAX;
// λͺ¨λ 물건 μ²λ¦¬ μλ£ β νμ¬ A νμ μ΄ κ²°κ³Ό
if (i == (int)v.size()) return a;
// μ΄λ―Έ κ³μ°λ μνλ©΄ λ°λ‘ λ°ν
if (dp[i][a][b] != -1) return dp[i][a][b];
// μ ν 1: Aκ° νμΉ¨
int takeA = solve(i + 1, a + v[i][0], b);
// μ ν 2: Bκ° νμΉ¨
int takeB = solve(i + 1, a, b + v[i][1]);
// λ κ²½μ° μ€ A νμ μ΄ λ μμ κ²½μ° μ μ₯
dp[i][a][b] = min(takeA, takeB);
return dp[i][a][b];
}
int solution(vector<vector<int>> info, int n, int m) {
amax = n;
bmax = m;
v = info;
memset(dp, -1, sizeof(dp));
int ans = solve(0, 0, 0);
if (ans == INT_MAX) return -1;
return ans;
}
그리λν λ°©μμΌλ‘ ν μ μλ€κ³ λ νλλ°, μ΄ λ°©λ²μ ꡬκΈλ§ν΄ 보λ μ ν΄κ° μλκ³ ν μ€νΈ μΌμ΄μ€κ° λΆμ€ν΄μ ν΅κ³Όλ μ½λμΌμλ μλ€κ³ ν©λλ€. μ¬κΈ°λ₯Ό μ°Έκ³ ν΄λ³΄μλ©΄ μ’μ κ² κ°μ΅λλ€. λ¬Έμ νΈμλλΌ κ³ μνμ ¨μ΄μ! |
flydongwoo
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
μΌμ 리뷰보λκΉ λ€λ€ DPκ° μλ DFSλ‘ νΈμ ¨λλ° μ λ 2μ°¨μ DPλ‘ ν΄κ²°νμ΅λλ€!
d[j] = Bμ νμ ν©μ΄ j(<m)μΌ λμ Aμ μ΅μν©μ ꡬνλ μνμ
λλ€.
Aκ° νμΉλ©΄ j κ·Έλλ‘ +a_i, Bκ° νμΉλ©΄ j+b_i(<m)λ‘ μ΄λνλ©° A μ¦κ° μμΌλ―λ‘
min_j dp[j]μ΄ A μ΅μ. μ΄ κ°μ΄ n μ΄μμ΄λ©΄ λΆκ°λ₯ν©λλ€.
#include <vector>
#include <algorithm>
#include <limits>
using namespace std;
int solution(int n, int m, vector<vector<int>> info) {
const int INF = numeric_limits<int>::max() / 4;
vector<int> dp(m, INF), ndp(m, INF);
dp[0] = 0;
for (size_t i = 0; i < info.size(); i++) {
int a = info[i][0];
int b = info[i][1];
for (int j = 0; j < m; j++) {
ndp[j] = INF;
}
for (int j = 0; j < m; j++) {
if (dp[j] == INF) {
continue;
}
if (dp[j] + a < ndp[j]) {
ndp[j] = dp[j] + a;
}
if (j + b < m) {
if (dp[j] < ndp[j + b]) {
ndp[j + b] = dp[j];
}
}
}
dp.swap(ndp);
}
int ans = *min_element(dp.begin(), dp.end());
if (ans >= n) {
return -1;
}
return ans;
}νλ‘κ·Έλλ¨Έμ€ λ¬Έμ λ€μ νμ μ½λ ꡬν λν
μΌ λΆλΆμμ μ‘°κΈμ© λ§νμ μ§μ μλ λμ λ°λ κ² κ°λ€μ.
λ¬Έμ νΈμλλΌ κ³ μ λ§μΌμ
¨μ΄μ!
π λ¬Έμ λ§ν¬
μμ λ²μ£
https://school.programmers.co.kr/learn/courses/30/lessons/389480
βοΈ μμλ μκ°
40λΆ
β¨ μλ μ½λ
π μλ‘κ² μκ²λ λ΄μ©