这个才是50
```
#include<bits/stdc++.h>
using namespace std;
int n,a[55],f[500005],g[500005],maxn;
int main(){
ios::sync_with_stdio(false);memset(f,-1,sizeof(f)),memset(g,-1,sizeof(g)),f[0]=g[0]=0;
cin>>n;for(int i=1;i<=n;i++){cin>>a[i];
for(int j=0;j<=maxn;j++){
f[j+a[i]]=max(g[j+a[i]],g[j]);
if(a[i]>=j&&g[j]!=-1)f[a[i]-j]=max(g[a[i]-j],g[j]+j);
else if(g[j]!=-1)f[j-a[i]]=max(g[j-a[i]],g[j]+a[i]);
}maxn+=a[i];
for(int j=0;j<=maxn;j++)g[j]=f[j];
}
cout<<(f[0]==0?-1:f[0]);
return 0;
}
```
by 沉鸣cmh @ 2022-05-11 22:51:15
直接贴代码~~AC~~ ~~无注解~~
```
#include<bits/stdc++.h>
using namespace std;
int n,a[51],din=0;
int dp[51][555555];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
din=din+a[i];
}
memset(dp,-0x7f7f7f,sizeof(dp));
dp[0][0]=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=din;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j+a[i]]);
if(j>=a[i])
dp[i][j]=max(dp[i][j],dp[i-1][j-a[i]]+a[i]);
else
dp[i][j]=max(dp[i][j],dp[i-1][a[i]-j]+j);
}
}
if(dp[n][0]) cout<<dp[n][0]<<endl;
else cout<<"-1"<<endl;
}
```
by Msc20120507 @ 2023-01-31 18:10:13