题目链接:精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课
题目解析:动态规划的考查(以背包dp为原型)。
注意砝码可以放在左边和右边
代码:(使用滚动数组节省空间)
//#define local
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const int MAXN=1e5+5;
int dp[2][MAXN]={0};
int w[MAXN];
int s[MAXN];
int n;
int main(){
#ifdef local
freopen("data.in","rb",stdin);
//freopen("data.out","wb",stdout);
#endif
scanf("%d",&n);
s[0]=0;
for(int i=1;i<=n;++i){
scanf("%d",&w[i]);
s[i]=s[i-1]+w[i];
}
dp[1][0]=dp[0][0]=1;
for(int i=1;i<=n;++i){
for(int j=1;j<=s[i];++j){
dp[i%2][j]=dp[(i-1)%2][j];
if(dp[i%2][j])
continue;
else{
if(j>=w[i]&&dp[(i-1)%2][j-w[i]]){
dp[i%2][j]=1;
}
else if(w[i]>=j&&dp[(i-1)%2][w[i]-j]){
dp[i%2][j]=1;
}
else if(j+w[i]<=s[i-1]&&dp[(i-1)%2][j+w[i]]){
dp[i%2][j]=1;
}
}
}
}
int ans=0;
for(int j=1;j<=s[n];++j){
if(dp[n%2][j])
++ans;
}
cout<<ans;
return 0;
}