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