-
반응형
1. 문제 조건
- N개의 물건이 있고 각 물건은 무게 W와 가치 V를 가짐
- 무게 K까지 담을 수 있을 때 물건의 가치합 최대값 구하기
2. 풀이 전 생각정리
- 각각의 물건을 한번씩 훑으며 가능한 모든 경우에 대한 가치합을 리스트에 저장한다.
- 무게 7까지 담을 수 있고 물건 2개의 (무게, 가치)가 (2,3), (4,2)라면
3 3 2 5 이런 식으로 저장하며 물건들의 가치합 최댓값은 5 임을 알 수 있다.
- 무게 합이 K를 초과하는 경우에는 담을 수 없음을 고려한다.
3. 테스트 케이스만 통과한 코드
N, K = map(int, input().split()) mapp = [] for _ in range(N): W, V = map(int, input().split()) mapp.append([W,V]) dp = [[0]*(K+1) for _ in range(N+1)] for i in range(1,N+1): #1~N for j in range(K+1): #0~K #넣는 것 시작할 수 있는지 if j == mapp[i-1][0] and mapp[i-1][0]<=K: dp[i][j] = max(dp[i-1][j], mapp[i-1][1]) if dp[i-1][j] != 0: if j + mapp[i-1][0] <=K: dp[i][j + mapp[i-1][0]] = max(dp[i-1][j], dp[i-1][j] + mapp[i-1][1]) else: dp[i][j] = dp[i-1][j] print(max(dp[N])
4. 성공 코드
- 시작하는데 시간이 조금 걸리더라도 모든 상황을 고려할 수 있는 깔끔한 점화식을 생각해 놓은 이후 코드를 짜는 것이 효율적인 것 같다.
N, K = map(int, input().split()) dp = [[0]*(K+1) for _ in range(N+1)] for i in range(1,N+1): #1~N W, V = map(int,input().split()) for j in range(K+1): #0~K if j<W: dp[i][j] = dp[i-1][j] else: dp[i][j] = max(dp[i-1][j], dp[i-1][j-W]+V) print(max(dp[N]))
반응형'IT > 백준' 카테고리의 다른 글
[백준] 1260 DFS와 BFS(Python) (0) 2021.10.12 [백준] 11053 가장 긴 증가하는 부분 수열(Python) (0) 2021.10.11 [백준] 1495 기타리스트 (Python) (0) 2021.10.05 [백준] 9251 LCS (Python) (0) 2021.10.05 댓글