思路和二维的01dp定义差不多,这种蒟蒻模拟复杂度会更高(篮球杯数据有点水,居然能过),但是方便不懂二维01dp的来理解。
集合now,目前所有称出的重量 集合newnow,用砝码去和集合里面的做加减
然后合并now和newnow。
#include <bits/stdc++.h>
//#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define fr first
#define se second
#define endl '\n'
using namespace std;
const int N=100+5;
int n,w[N];
void solve(){
cin>>n;
per(i,1,n)cin>>w[i];
set<int>now,newnow;
now.insert(w[1]);
now.insert(0);
per(i,2,n){
for(auto j:now)
newnow.insert(abs(j+w[i])),newnow.insert(abs(j-w[i]));
for(auto j:newnow)
now.insert(j);
}
cout<<now.size()-1;//最后0是不算的
}
signed main(){
ios::sync_with_stdio(false),cin.tie(nullptr);
int t=1;
while(t--)solve();
return 0;
}