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

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

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

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

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

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

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<bitset>
 5 using namespace std;
 6 typedef long long ll;
 7 const int maxn=105,maxa=250;
 8 
 9 inline ll rd(){
10     ll x=0;char c=getchar();int neg=1;
11     while(c<'0'||c>'9'){
12         if(c=='-') neg=-1;
13         c=getchar();
14     }
15     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
16     return x*neg;
17 }
18 
19 int a[maxn],N;
20 bool f[25005];
21 
22 int main(){
23     // freopen("money.in","r",stdin);
24     // freopen("money.out","w",stdout);
25     int i,j,k;
26     for(int T=rd();T;T--){
27         N=rd();
28         int ans=N;
29         for(i=1;i<=N;i++) a[i]=rd();
30         memset(f,0,sizeof(f));
31         sort(a+1,a+N+1);
32         int M=a[N];
33         f[0]=1;
34         for(i=1;i<=N;i++){
35             if(f[a[i]]) ans--;
36             else{
37                 for(j=a[i];j<=M;j++){
38                     f[j]|=f[j-a[i]];
39                 }
40             }
41         }
42         printf("%d\n",ans);
43     }
44     return 0;
45 }

 

转载于:https://www.cnblogs.com/Ressed/p/9981924.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值