思路详细见代码注释,注意称不出重量为0的物体
#include <bits/stdc++.h>
using namespace std;
int dp[105][100005]; //dp[i][j]=1表示i个砝码可以称出重量j
int a[105];
int sum;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i]; //计算出可以称出的最大重量
}
dp[1][a[1]]=1;
for(int i=2;i<=n;i++) //枚举每个砝码 (加入每个砝码)
{
for(int j=1;j<=sum;j++) //复制状态,加入当前砝码前可以称得的重量加入后也可以得到
{
if(dp[i-1][j]!=0)
dp[i][j]=dp[i-1][j];
}
dp[i][a[i]]=1; //当前砝码的重量一定可以称出来
for(int j=1;j<=sum;j++) //枚举可以称出的重量
{
if(dp[i-1][j]!=0) //如果i-1个砝码可以称出j,那么枚举加入新的砝码可以称得的重量
{
if(j+a[i]<=sum)
dp[i][j+a[i]]=1;
dp[i][abs(j-a[i])]=1;
}
}
}
int ans=0;
for(int j=1;j<=sum;j++)
{
if(dp[n][j]!=0)
ans++;
}
cout<<ans<<endl;
return 0;
}