货币系统

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

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

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

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

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

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

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

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

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

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

posted @ 2024-01-25 14:57  最爱丁珰  阅读(2)  评论(0编辑  收藏  举报