货币系统

其实这道题目如果加上证明有蓝的

观察样例的解释,我们可以猜测一个结论:最终的货币面值一定由最初的货币面值的子集构成,而且没有选择的货币面值是可以被选择的货币面值线性表示的(其实由线性代数的思想也可以比较容易地猜出这个结论,但是注意不要用线性方程组有解判定,即系数矩阵的秩等于增广矩阵的秩,因为这里要求向量的每个分量都是非负的,不能是随意的一个向量)

所以我们马上就得到了一个DP算法,在考场上实在证不出来直接写就好了:

1、将a数组从小到大排序

2、最小的数必须要选,然后利用完全背包的思想,从ai到最大值筛选一遍,将可以组成的打上标记

3、在判断后面的数字时,如果已经被标记过了,就不再选,没有被标记过就标记一下,再筛选一次数(即一次完全背包)

那么我们来详细证明一下这个结论

假设我们按照DP算法选出来的是数组A[1k],最终选出的货币系统是B(假设两个数组都从小到大排序了)

奠基:显然B[1]只能等于A[1],否则要么A[1]无法被B表示,要么B[1]无法被A表示

归纳:假设A的前i1个与B的前i1个相等,那么一定有A[i]=B[i],这是因为B[i]既不能严格介于A[i1]A[i]之间,不然的话,B[i]一定不能被B的前i1个数表示(因为B是我们选出的货币系统,是线性无关的,不存在某一个数能被其他数线性表示),所以B[i]不能被A线性表示,这是不可能的;同理可得B[i]一定不会大于A[i](否则A[i]无法被B表示),这就推出了A[i]=B[i]

posted @   最爱丁珰  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示