[Leaf] [P5020] 货币系统
luogu-p5020-货币系统">Luogu-P5020 货币系统
1. 题面梗概
中译中: 给你一个硬币集合 ,你要找一个最小的集合 ,使得 能凑出来的钱和 能凑出来的钱一模一样。求 里面最少有几个数。
2. 逻辑推导
看到这个题,第一反应是:感觉像是线性代数中的求基,但在数论背景下,我们需要深入分析。
直觉:我猜测我们要找的 集合应该是 集合的一个子集,但直觉归直觉,我们需要通过逻辑证明:
2.1 反证法
-
我们先证明: 集合中不能被其他元素组成的数,必然存在于 集合中。
-
设 且 不能被 集合外除它以外的元素组成。若 ,那么就说明 集合中必然有一组数能够组成 。
-
那么这组数中至少存在一个不在 集合内,且无法被 集合中组成的数,矛盾。
-
-
接着就可以证明 。
- 设 且 。由于 和 等价,那么 必然能被 中的数字组成。而这些数字又属于 。
- 这意味着 能被 中的其他数组组成,那么 去掉 后依然等价,这与 的定义矛盾。
结论: 就是从 中剔除掉所有能被其他数组成的元素后剩下的集合。
2.2 解决
根据数学常识,一个数 只能被比它小的数组成。那么很显然我们只要先将数组排个序,然后考虑每个数能不能被前面的数字组成即可。
写到这里就很明显了,我们可以用搜索,也可以用背包DP,这里我采用完全背包来解决。
DP: 表示 这个数能否被组成。。
3. 代码实现
▶
AcCode
1 | |
4. 复盘
-
复杂度: 。
-
碎碎念: 这题的价值在于理解集合的关系,然后才是完全背包DP解决最后一步。
-
关联笔记: 背包DP
[Leaf] [P5020] 货币系统
http://miqiu.space/posts/910566d1/