https://www.lanqiao.cn/problems/1447/learning/
#include<bits/stdc++.h>
using namespace std;
int n;
int vis[1000];
long long sum=0;
int dp[500][100000];
int main(){
cin>>n;
for(int i=1;i<=n;i++){//添加砝码时,把砝码的负数也添到数组里面,砝码总数就为2n个
cin>>vis[i];
vis[n+i]=-vis[i];
sum+=vis[i];
}
int pian=sum;
dp[0][pian]=1;//偏移量——>防止数组下标为负数
for(int i=1;i<=2*n;i++){
for(int j=-sum;j<=sum;j++){
dp[i][j+pian]=dp[i-1][j+pian];
if(j-vis[i]>=-sum&&j-vis[i]<=sum) dp[i][j+pian]=dp[i][j+pian]||dp[i-1][j-vis[i]+pian];
}//此时,只要考虑放砝码和不放砝码,不要考虑左放砝码和右放砝码了
}
int cont=0;
for(int i=1;i<=sum;i++){
if(dp[2*n][i]) cont++;
}
cout<<cont<<endl;
return 0;
}