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

+ Recent posts