Loading...

가방이 여러개인 multiple 0-1 knapsack(배낭 문제) 해법 배우기

1. 다중 배낭 문제(multiple 0-1 knapsack) https://atcoder.jp/contests/past202206-open/tasks/past202206_h H - Two KnapsacksAtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.atcoder.jp  각각 무게 제한이 A,B인 2개의 가방이 있다고 하자. 이 2개의 가방에 무게가 W, 가치가 V인 물건을 담고자 한다. 2개의 가방에 담긴 물건 가치 합이 최대가 되도록 하는 방법은? 처음에는... 단순히 무게 제한이 A인 가방에 물건을 담고, 담은 물건은 제외한 다음 무..

0-1 knapsack 배낭 문제 해법 반드시 알아야하는 디테일(물건을 중복해서 담는 경우)

12865번: 평범한 배낭 (acmicpc.net) 최대 한도 무게가 K로 정해진 가방 1개에 무게가 W이고 가치가 V인 N개의 물건을 담고자 할때, 가치가 최대가 되도록 담고자 한다. 당연히 하나의 물건은 가방에 한번만 담을 수 있다  1. 1차원 배열 DP[i] = 가방에 담긴 물건들의 무게 합이 i일때, 가치의 최댓값 DP[i] = max(DP[i], DP[i-w] + v) dp = [0]*(K+1)for w,v in bag: for i in range(K,-1,-1): if i-w >= 0: dp[i] = max(dp[i], dp[i-w] + v)print(dp[K])  주목할 부분은 무게 i = 0,1,2,3,..,K가 아..

2024. 6. 26. 03:24

i < j < k < l을 O(N)에 도는 미친 다이나믹 프로그래밍 테크닉

15487번: A[j]-A[i]+A[l]-A[k] (acmicpc.net) 크기 N인 주어진 배열 A에서 i  N은 최대 1000000이라 4중 for문으로 찾는건 당연히 불가능하다 A[j] - A[i]의 최댓값과 A[l] - A[k]의 최댓값을 나눠서 구하면 좋을 것 같다  근데 i  어떻게 구할 수 있을까? 현재 0 ~ j 구간을 보고 있을때 A[j] - A[i]의 최댓값은, A[j] - (A[0] ~ A[j-1]중 최솟값) dp[j] = i  j = 0, 1, 2, 3, ... 가면서 A[j]의 최솟값을 min_value로 항상 갱신해놓는다면, 현재 j에 대해 0~j-1까지 최솟값은 min_value이고 그러므로 A[j] - min_value로 최댓값을 구할 수 있다. 이를 dp[j]에 저장해놓고 ..

게임이론 기본기 익히기1 - 약수 더하기 게임에서 반드시 이기는법

22846번: 인증된 쉬운 게임 (acmicpc.net) 모니터에 1이 쓰여있는데, 두 사람이 선공부터 번갈아가며 모니터에 쓰인 수의 약수를 더해간다. 이 때 제한 k를 초과한 사람이 패배하게 된다. k가 주어질때, 항상 완벽하게 플레이하는 두 사람중 누가 이길까 이런 게임 문제는 보통 1부터 최선의 전략으로 해보면 눈치로 풀면 풀리는 경우가 종종 있더라 실제로 해보면 k = 2,6의 경우에만 선공이 이길 수 있고 나머지는 후공이 반드시 이긴다  k = int(input())if k == 2 or k == 6: print('Kali')else: print('Ringo')  근데 언제까지 이렇게만 할 수는 없지 그리고 이렇게 찾기 힘든 문제도 있더라 개념을 확실히 알아야돼 1) 상..

2024. 6. 15. 01:58

DFS로 사이클 탐지하는 알고리즘 탐구하기2 -사이클의 길이-

1. 연습문제1 9466번: 텀 프로젝트 (acmicpc.net) 문제를 보면 u가 A[u]를 향하는 그래프이고 이 그래프에서 사이클을 모두 찾아 각 사이클에 속하는 노드의 개수를 구하고 전체 노드 수에서 사이클에 속하는 노드의 개수를 빼면 된다 dfs로 사이클을 탐지할 수는 있는데... 사이클에 속하는 노드의 개수는 어떻게 알 수 있을까? 노드 u1부터 u2,u3,...,un을 차례대로 방문한다고 생각해보자 u1 > u2 > u3 > .... > un 그러다가 다시 un에서 u1으로 온다면? u1 > u2 > u3 > ... > un > u1으로 오면 (u1,u2,.u3,...,un)이 하나의 사이클이 된다. 따라서 dfs로 노드를 방문할때마다, 방문한 노드의 번호를 1,2,3,.. 순서대로 매겨준다...

중간에서 만나기 테크닉 - 저장하고 검사하는 것이 아니라 검사를 먼저하고 저장하기

5624번: 좋은 수 (acmicpc.net)  정수 배열에서 현재 위치 i번째 수 앞에 있는 수들 중 세 수의 합이 현재 위치 i번째 수와 같게 되는 경우,  그러한 수의 개수를 구하는 문제 "세 수"는 중복해서 선택해도 좋다 예를 들어 [-1,2,0]이면 0은 -1 -1 + 2 = 0이므로 이 조건에 만족하는 수이다 n이 최대 5000인데, 단순하게 짜면 $O(N^{4})$이라 매우 느리다 대충 이런 느낌 for i in range(n): a = A[i] for j in range(i): for k in range(i): for w in range(i): ..