你有一架天平和N 个砝码,这N 个砝码重量依次是W1, W2, ... , WN。
请你计算一共可以称出多少种不同的重量?
注意砝码可以放在天平两边。
输入格式
输入的第一行包含一个整数N。
第二行包含N 个整数:W1, W2, W3, ... , WN。
对于50% 的评测用例,1 ≤ N ≤ 15。
对于所有评测用例,1 ≤ N ≤ 100,N 个砝码总重不超过100000。
输出格式
输出一个整数代表答案。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<utility>
#include<map>
#include<stack>
#include<sstream>
#include<math.h>
#include<bitset>
#include<queue>
using namespace std;
int ans=0,n,w,maxn=0;
bool vis[100005];
bool ret[100005];
int main(){
cin>>n;
scanf("%d",&w);
vis[w]=true;
maxn+=w;
for(int i=1;i<n;i++){
scanf("%d",&w);
for(int j=1;j<=maxn;j++){
if(vis[j]&&!ret[j]){
if(!vis[abs(j-w)]){
vis[abs(j-w)]=true;
ret[abs(j-w)]=true;
}
if(!vis[j+w]){
vis[j+w]=true;
ret[j+w]=true;
}
}
}
memset(ret,false,sizeof(ret));
vis[w]=true;
maxn+=w;
}
for(int i=1;i<=100000;i++){
if(vis[i]){
ans++;
}
}
cout<<ans<<endl;
return 0;
}