题目链接:https://www.luogu.com.cn/problem/P8742
大意是给出砝码,求称出的重量的数量。
经过观察,发现新给出的第i个砝码,只是在第i-1个砝码的基础上产生印象。因此只需要两张映射表做一个滚动数组即可
code:
const int nn = 1e5+10; const int N = 110; bool sign[nn]; bool tsign[nn]; int main() { //cin.ignore(numeric_limits<streamsize>::max(),'\n') int n; cin>>n; int x; int sum = 0; tsign[0] = true; sign[0] = true; for(int i=1;i<=n;i++){ cin>>x; sum+=x; for(int j=0;j<=sum-x;j++){ // 枚举之前的总量 if(tsign[j]){ sign[j+x] = true; sign[abs(j-x)] = true; } } for(int j=0;j<=sum;j++) tsign[j] = sign[j]; } int ans = 0; for(int i=1;i<nn;i++){ if(sign[i]) ans++; } cout<<ans<<endl; }