https://www.acmicpc.net/problem/1495
1495번: 기타리스트
첫째 줄에 N, S, M이 주어진다. (1 ≤ N ≤ 50, 1 ≤ M ≤ 1,000, 0 ≤ S ≤ M) 둘째 줄에는 각 곡이 시작하기 전에 줄 수 있는 볼륨의 차이가 주어진다. 이 값은 1보다 크거나 같고, M보다 작거나 같다.
www.acmicpc.net
N, S, M = map(int,input().split())
vols = list(map(int,input().split()))
sounds = list()
sounds.append(-1)
def vol_control(now,volumns, start, M):
if now !=N-1:
if start + volumns[now] <= M:
vol_control(now+1, volumns, start + volumns[now], M)
if start - volumns[now] >= 0:
vol_control(now+1, volumns, start - volumns[now],M)
else:
if start + volumns[now] <= M:
sounds.append(start + volumns[now])
if start - volumns[now] >= 0:
sounds.append(start - volumns[now])
vol_control(0,vols,S,M)
print(max(sounds))
위 문제를 위와같은 공식으로 풀었지만 메모리 초과 오류가 난다.
n, s, m = map(int, input().split())
array = list(map(int, input().split()))
dp = [[0]*(m+1) for _ in range(n+1)]
dp[0][s] = 1
for i in range(1, n+1):
for j in range(0, m+1):
if dp[i-1][j] != 0:
if j + array[i-1] <= m:
dp[i][j+array[i-1]] = 1
if j - array[i-1] >= 0:
dp[i][j-array[i-1]] = 1
result = -1
for i in range(m, -1, -1):
if dp[n][i] == 1:
result = i
break
print(result)
해서 아래 방식으로 해결하였다 약간 계수 정렬을 사용한 느낌의 코드이다.
'알고리즘' 카테고리의 다른 글
기본 DFS와 BFS (0) | 2021.11.24 |
---|---|
[JAVA]ArrayList 사용법 (0) | 2021.11.23 |
병합정렬 & pypy3 (0) | 2021.11.06 |
동적계획법 (DP: Dynamic Programming) Python (0) | 2021.11.04 |
계수 정렬(Counting Sort) 알고리즘 (0) | 2021.11.04 |