题意简述
一个货币系统由长度为$n$的正整数序列$a$组成。每个数珂以用无限次。定义两个货币系统是等价的,对于任意一个正整数$x$,要么两个都能凑出$x$,要么两个都不能。
给定一个货币系统$(n,a)$,$n<=100$,$a_i<=25000$,请你求出一个和它等价的货币系统,使得这个货币系统中不同货币的数量最少。输出这个最少的数量。
思路框架
如果货币系统中有一个数珂以被别的凑出来,就珂以去掉它。完全背包维护即珂。
具体思路
显然$a$的顺序无关紧要,于是排个序。
设$cxk[i]$表示$i$能否被凑出来,$0$表示能,$1$表示不能。
显然答案不会超过$n$,因为显然自己和自己是等价的。初始时,设答案为$n$。
枚举每个$a_i$。如果$cxk[a_i]=1$,说明$a_i$没用,去掉。然后用完全背包更新一下即珂。
实现注意
- 节省空间,cxk珂以开成bitset类型
- 注意边界:cxk[0]=1
代码
1 |
|