記貨幣種類為\(n\),面額陣列為\(a[1...n]\)的貨幣系統為\((n,a)\)。貨幣系統\((n,a)\)與\((m,b)\)等價,當且僅當對於\(\forall x\in \mathbf n\),\(x\)要麼均可以被兩個貨幣系統表示,或者不能被任何乙個表示。
給定乙個貨幣系統\((n,a)\),求與其等價的貨幣系統\((m,b)\),並使\(m\)盡可能小。
我們把貨幣系統\((n,a)\)看做集合\(a\),貨幣系統\((m,b)\)看做集合\(b\),我們猜測\(b⊆ a\),接下來進行證明。
一些奇奇怪怪的證明
證明1:\(a\)集合內不能被其他數表示的數必然存在於\(b\)集合內。
證明:我們設\(x\in a\)且\(x\)不能被\(a\)集合中除他以外的元素表示出來。(即\(\forall y⊆a,\exists x\in a,x\notin t,x\neq \sum\limits_ a\))
我們假設\(x\notin b\),由於兩個集合等價,所以\(b\)集合一定能夠表示出\(x\),換句話說\(\exists x⊆b,x=\sum\limits_b\)
那麼\(x\)集合中的元素中至少有乙個不在\(a\)內,並且不能被集合\(a\)裡的元素組成(因為如果不存在的話\(a\)內的元素就可以表示\(x\)了)。這樣與\(b\)集合的定義產生矛盾。這樣我們可以證明。
證明2:\(b⊆a\)
證明:假設\(\exists x\in b,x\notin a\)
根據題目條件,\(x\)一定可以被\(a\)集合內的數字所組成。那麼必然\(\exists u⊆a,u=\)可以用來組成\(x\)並且這些元素都不能被\(a\)集合內的元素組成(因為如果\(a_i\)能被\(a\)集合內其他數組成,那麼必然可以用那些數來代替\(a_i\)),根據上乙個結論我們知道\(u⊆b\).
那麼也就是說\(x\)可以被\(b\)集合內的數字組成,那麼凡是可以用\(x\)組成的數都可以被\(b\)集合內的其他數字組成,那麼也就是說即便從集合\(b\)中去掉\(x\)元素也依舊滿足條件,這就與\(b\)集合的定義矛盾。
所以\(\forall x\in b,x\in a \iff b⊆a\)
演算法最後:在\(a\)集合中,能被其他數組成的數必然不在\(b\)集合內
到這裡,我們只需要計算出\(a\)集合內存在多少個能被其他數計算出來的就行了。
使用完全揹包。
根據常識,我們知道\(x\)只能被他小的數字組成。
我們對陣列排個序,然後對於每乙個數考慮能不能被它前面的數字所組成。我們知道如果\(x\)能夠被前\(i\)個數字組成,並且組成\(x\)的數中包含\(a_i\),那麼\(x-a_i\)也可以用前\(i\)個數來組成。那麼我們很容易想到定義\(f(x)\)表示\(x\)能否被組成,則\(f(x)=f(x)∨f(x-a_i)\)
#include#include#includeusing namespace std;
#define maxai 25005
#define maxn 105
int f[maxai];
int a[maxn];
int main()
for(j=a[i];j<=a[n];j++)
}printf("%d\n",ans);
}return 0;
}
NOIP2018D1T2 貨幣系統
題面 這道題我是親自在考場上考過的 先說題解吧 乙個貨幣系統中 x xx是沒用的,當且僅當他能被系統中別的貨幣表示 我們拿rmb rmbrm b來舉個例子 發現所有的錢都能被一分錢表示出來 所以只留乙個一分錢的就好了 啪咳咳 不鬧了 題面可以簡述為 給你乙個貨幣系統a aa 讓我們可以給他簡化 使得...
TJOI2018 d1t2 智力競賽
題意不太明確.這題的n需要一上來就 1。就是求乙個可交最小路徑覆蓋,二分答案即可。不知道為什麼我的常數那麼大,別人幾乎300ms就完事了,我需要800ms。include include include using namespace std inline char gc return s inli...
NOIP2018 D1T1 鋪設道路
目錄春春是一名道路工程師,負責鋪設一條長度為 n 的道路。鋪設道路的主要工作是填平下陷的地表。整段道路可以看作是 n 塊首尾相連的區域,一開始,第 i 塊區域下陷的深度為 di。春春每天可以選擇一段連續區間 l,r 填充這段區間中的每塊區域,讓其下陷深度減少 1。在選擇區間時,需要保證,區間內的每塊...