π λ°±μ€ νλ²ν λ°°λ
μ²μμ dfsλ‘ μΌλ¨ νμ΄λ΄€λ€.
μκ° μ΄κ³Όκ° λμ μ΄κ±° dp λ¬Έμ μΈκ° μΆμ΄μ μ°Ύμλ΄€λ€.
μμ λ΄κ° μ½ν dpλ¬Έμ ... κ²μν΄λ³΄λ μ€λ λμκΈ°λΌκ³ νλλ° κ·Έλ₯ dp μλκ°... μΆμλ€.
- νμ΄
def solve(): import sys N, K = map(int, sys.stdin.readline().split()) dp = [[0]*(K+1) for _ in range(N+1)] thing_list = [[0, 0]] for _ in range(N): thing_list.append(list(map(int, sys.stdin.readline().split()))) for i in range(1, N+1): for j in range(1, K+1): w = thing_list[i][0] v = thing_list[i][1] if j < w: dp[i][j] = dp[i-1][j] else: dp[i][j] = max(dp[i-1][j], v+dp[i-1][j-w]) print(dp[N][K]) if __name__ == "__main__": solve()
dp λ¬Έμ λ μ΄ν΄νλ©΄ μ½μ§λ§ κ·Έ μ μλ λκ°... μΆλ€ μμ§ν λ¬Έμ λ₯Ό λ³΄κ³ λ μ μκ°μ΄ λμ§ μλλ€.
μ²μμλ 그리λμΈκ°? dfs λ¬Έμ μΈκ°? μΆμλ€.
dp... λ§μ΄ νμ΄μΌκ² λ€.
π λ°±μ€ λλ©©μ΄ μ κ±°
μ λ΅λ₯ λμμ νμ΄λ³Έ νλ λ¬Έμ μΈλ° μ μ λ΅λ₯ μ΄ λμμ§ μμλ€.
μ¬μμκ° μλλΌ μ무λ λͺ»νμ΄μ κ·Έλ₯ λ΅ λΆμ¬λ£μ΄μ μ λ΅λ₯ μ΄ λμκ±°λ€.
μ²μμ 그리λλ‘ μκ°νλλ° κ°λ‘ μΈλ‘λ‘μ΄λλΆν° μμν΄μΌν μ§ κ·Έκ±Έ λͺ¨λ₯΄κ² μ΄μ λλ κ²μμ ν΄λ΄€λ€.
κ·Έλ°λ° μ΄ λ¬Έμ λ₯Ό νκΈ°μν΄μλ
- μ΅λ μ΄λΆ λ§€μΉ
- μ΅μ λ²ν μ€ μ»€μ
- μ½°λκ·Έμ μ 리
μ μΈκ°μ§λ₯Ό μμμΌ ν μ μκ³ μ΄ν΄κ° κ°λ₯νλ€...
μκ°μ΄ κ±Έλ €μ μ΄ν΄λ₯Ό νκΈ΄ νλ€. λ§μ μ΄ν΄νλ©΄ μ΄ν΄λ λλλ° μμ© λ¬Έμ κ° λμ€λ©΄ ν μ μμκΉ...?
μ½ν μ μ΄λ° λ¬Έμ κ° λμ¬κΉ? μΆκΈ°λ νλ€.
- νμ΄
if __name__ == "__main__": import sys N, K = map(int, sys.stdin.readline().split()) graph = {x:[] for x in range(1, N+1)} for _ in range(K): row, col = map(int, sys.stdin.readline().split()) graph[row].append(col) matching = [False for _ in range(N+1)] def dfs(idx): if visited[idx]: return False visited[idx] = True for i in graph[idx]: idx_i = matching[i] if idx_i == False or dfs(idx_i) == True: matching[i] = idx return True return False result = 0 for i in range(1, N+1): visited = [False for _ in range(N+1)] if dfs(i): result += 1 print(result)