关于一道noip题目的数学分析与简略证明

## Problem
[NOIp2018Day1T2 P5020 货币系统](https://www.luogu.org/problem/P5020)
## Proposition
定义$ n$元集合$A=\left\{ a_1,a_2,...,a_n \right\}$ 为 $
\left( n,a \right) $, $ m $ 元集合$B$ $=$ { $b_1$,$b_2$,...,$b_m$} 为 $
\left( m,b \right) $ ,我们称$A$和$B$是等价的,当且仅当其满足以下两条件:

#### 1.对于 $\forall$ $x$ ,若$x$可以被集合$A$中的元素表示,$x$亦可被$B$中元素表示
#### 2.对于$\forall$ $x$,若$x$不可以被集合$A$中的元素表示,$x$亦不可被$B$中元素表示
当$m$最小,且$A$与$B$等价时,$B$ $\subseteq$ $A$;
## Prove
$\because$ $A$能够表示的数$B$均能表示

$\therefore$ $A$中元素必能被$B$表示

这是因为假若 $\exists$ $q$ $\in$ $A$不能被$B$表示,$q$却能被$A$表示,这样与条件矛盾.

另一方面,对于 $A$ 无法表示的数,要使$B$也无法表示,$B$只能是 $A$ 的子集

$\because$ 若 $\exists$ $q$ $\notin$ $A$,$q$ $\in$ $B$,
而$q$可被$B$表示,由条件可知$q$也能被$A$表示.

这样下去,$q$既然能被$A$所表示,并且$B$中的元素一定不可互相表示,否则违背了$m$最小的原则.而$B$又能表示$A$中的任意元素,那么$q$能且仅能被它本身表示,$b_i$ $ \in $ $A$,否则$q$可被$A$中的其他元素表示,亦可被$B$中的其他元素表示,这与$B$中元素个数最小矛盾.

综上,我们知道,对于每个$B$中元素,它必然是$A$中的元素,也就是对于$\forall$ $x$ $\in$ $B$,有$x$ $\in$ $A$.即$B$ $\subseteq$ $A$

证明完毕.

## Solution
只要看一下$A$中的元素是否能被$B$表示即可.答案即为$n$减去$A$中可以被其他元素表示的元素数量.

这里我们用完全背包解决,因为每个元素加几次都可以

#include<bits/stdc++.h>
using namespace std;
int a[25005],f[25005],n,t,ans;
int main(){
cin>>t;
while(t--){
cin>>n;
memset(f,0,sizeof(f));
ans=n;
for(register int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
f[0]=1;//初始化,最小的一定不能被拼
for(register int i=1;i<=n;i++){
if(f[a[i]]){//能拼起来,答案减1
ans--;
continue;//不看下面了,剪枝
//这里放在前面的原因是一个数只能被比他小的数组成
//剪枝的可行性:被一个能被其他数组成的数组成的数在后面扫一遍一样
//该行的仍然会行,但这样少了很多次数
}
for(int j=a[i];j<=a[n];j++){//完全背包
f[j]=f[j]|f[j-a[i]];//能不能拼起来 
}
}
cout<<ans<<endl;
}

return 0;
}

 

## End
本蒟蒻写这篇题解也发现了自己的问题,参考了一些题解.

本题解是蒟蒻我对dalaos的题解的理解与总结,可能更详细些

 

posted @ 2020-06-27 14:33  te5555  阅读(39)  评论(0)    收藏  举报