이번 문제는 다이나믹 프로그래밍을 활용하여 해결하였다. 여태 풀었던 다이나믹 프로그래밍과 조금 다르게 메모라이제이션을 하였다. (n+1)*(m+1)의 리스트를 만들고 n을 순회하면서 리스트를 한줄씩 거치게 된다. 순회 전에 dp[0][s]를 1로 바꿔준다. 그리고 반복을 통해서 볼륨이 가능한 위치의 원소를 모두 1로 갱신시켜주고 dp[-1] 리스트를 확인하면서 1로 체크되어 있는 가장 큰 인덱스를 정답으로 출력하였다.
점화식은 dp[i-1][j]이 1일 때, dp[i][j+v[i-1]]=1, dp[i][j-v[i-j]]=1
이다.
n, s, m=map(int, input().split())
v=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(m+1):
if dp[i-1][j]==0:
continue
if j+v[i-1]<=m:
dp[i][j+v[i-1]]=1
if j-v[i-1]>=0:
dp[i][j-v[i-1]]=1
for i in range(m, -1, -1):
if dp[-1][i]==1:
print(i)
break
else:
print(-1)