2025牛客周赛108场e题
完全背包好题-小苯的有趣数
主要是思想
- 你要考虑最少的情况为n-1个好数
- 所以你只需要考虑sum总 数能否刚好分配n个背包
- 完全背包的板子
- 新学到的知识点是lambda函数写法 还挺好用的
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<cstring>
using namespace std;
int n,nn;
int num[102][20005];void init(){vector<int> ve;memset(num,0,sizeof num);auto square=[&](int v) -> bool {int ls=sqrt(v);
// int rt=ls*ls;return (ls*ls==v);};auto check=[&](int v) -> bool {if(!square(v)) return 0;int tps=0;while(v){tps+=(v%10);v/=10;}return square(tps);};for(int i=1;i<=100;i++){int tp=i*i;if(check(tp)){ve.push_back(tp);}}num[0][0]=1;//初始化for(int i=1;i<=100;i++){for(auto & val:ve){for(int j=val;j<=i*100;j++){num[i][j]|=num[i-1][j-val];}}}
}int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>nn;init();while(nn--){cin>>n;int s=0;for(int i=0;i<n;i++){int val;cin>>val;s+=val;}cout<<n-1+num[n][s]<<endl;}return 0;
}