luogu5020 [NOIp2018]货币系统 (完全背包)

时间:2023-03-09 14:37:59
luogu5020 [NOIp2018]货币系统 (完全背包)

我那个新的货币系统,就是把原来的货币系统中能被其他数表示的数删掉

那我就算有多少数能被别的数表示,那肯定是要被比它小的表示

于是排个序做完全背包就好了

但是我太zz不会完全背包,然后写了个bitset乱搞还开了250000,T到亲妈都不认识

其实完全背包就是把背包的从后往前更新变成了从前往后更新

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
using namespace std;
typedef long long ll;
const int maxn=,maxa=; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){
if(c=='-') neg=-;
c=getchar();
}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int a[maxn],N;
bool f[]; int main(){
// freopen("money.in","r",stdin);
// freopen("money.out","w",stdout);
int i,j,k;
for(int T=rd();T;T--){
N=rd();
int ans=N;
for(i=;i<=N;i++) a[i]=rd();
memset(f,,sizeof(f));
sort(a+,a+N+);
int M=a[N];
f[]=;
for(i=;i<=N;i++){
if(f[a[i]]) ans--;
else{
for(j=a[i];j<=M;j++){
f[j]|=f[j-a[i]];
}
}
}
printf("%d\n",ans);
}
return ;
}