下面是我的写法
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int N,S,V,v[55],f[55][1005];
int main()
{
cin>>N>>S>>V;
for(int i=1;i<=N;i++)cin>>v[i];
//f[i][j]:前i首歌中选择,音量不超过j的最大音量
//初值
for(int i=S;i<=V;i++)f[0][i]=S;
for(int i=0;i<S;i++)f[0][i]=-inf;//不可能事件
for(int i=1;i<=N;i++)
for(int j=0;j<=V;j++)
{
int a=f[i-1][j+v[i]]-v[i],b=f[i-1][j-v[i]]+v[i];
if(j>=v[i] && b>0)
{
if(j+v[i]<=V && a>0)f[i][j]=max(a,b);
else f[i][j]=b;
}
else
{
if(j+v[i]<=V && a>0)f[i][j]=a;
else f[i][j]=-inf;//无法避免低于0或高于maxlevel
}
}
if(f[N][V]<0)cout<<-1;
else cout<<f[N][V];
return 0;
}