牛客网【每日一题】5月27日题目精讲 货币系统
鏈接:
文章目錄
- 題目描述
- 題解:
- 代碼:
題目描述
在網友的國度中共有n種不同面額的貨幣,第i種貨幣的面額為a[i],你可以假設每一種貨幣都有無窮多張。為了方便,我們把貨幣種數為n、面額數組為a[1…n]的貨幣系統(tǒng)記作(n,a)。
在一個完善的貨幣系統(tǒng)中,每一個非負整數的金額x 都應該可以被表示出,即對每一個非負整數x,都存在n個非負整數t[i] 滿足a[i] x
t[i] 的和為x。然而,在網友的國度中,貨幣系統(tǒng)可能是不完善的,即可能存在金額x不能被該貨幣系統(tǒng)表示出。例如在貨幣系統(tǒng)n=3,
a=[2,5,9]中,金額1,3就無法被表示出來。
兩個貨幣系統(tǒng)(n,a)和(m,b)是等價的,當且僅當對于任意非負整數x,它要么均可以被兩個貨幣系統(tǒng)表出,要么不能被其中任何一個表出。
現在網友們打算簡化一下貨幣系統(tǒng)。他們希望找到一個貨幣系統(tǒng)(m,b),滿足(m,b)
與原來的貨幣系統(tǒng)(n,a)等價,且m盡可能的小。他們希望你來協(xié)助完成這個艱巨的任務:找到最小的m。
輸入描述:
輸入的第一行包含一個整數T,表示數據組數。接下來按照如下格式分別給出T組數據。
每組數據的第一行包含一個正整數n。接下來一行包含n個由空格隔開的正整數a[i]。
輸出描述:
輸出文件共T行, 對于每組數據, 輸出一行一個正整數, 表示所有與(n, a)等價的貨幣系統(tǒng)(m, b)中, 最小的m。
示例1
輸入
輸出
2 5說明
在第一組數據中,貨幣系統(tǒng)(2, [3,10])和給出的貨幣系統(tǒng)(n, a)等價,并可以驗證不存在m < 2的等價的貨幣系統(tǒng),因此答案為2。
在第二組數據中,可以驗證不存在m < n的等價的貨幣系統(tǒng),因此答案為5。
備注:
1 <= T <= 20, 1 <= n <= 100, 1 <= a[i] <= 25000
題解:
首先,傷感一分鐘,紀念我逝去的oi
我唯一參加過的一屆的noip,讓我永生難忘
我記得當時考完后,有人戲稱為大凱的疑惑
我們來看一下題,先知道什么是貨幣系統(tǒng):其實就是這幾種不同面值的錢任意組合出其他錢。
如果一個貨幣系統(tǒng)中有3,有6,那么6就可以省略,因為6可以由兩個3組成,這樣我們就可以得到一個最小貨幣系統(tǒng),這個貨幣系統(tǒng)是原來的子集,且里面每種面值都是獨一無二不可代替的,與原本的是等價關系
我們可以從最小面值開始(因為最小面值肯定無法代替),然后面值依次變大
這樣,題意就成了,給你一堆數,每個數可用無數次,問能組成多少數?
這不就是完全背包問題
我們先排序
然后對前i-1個貨幣進行完全背包,不能被取代的幣值也加入背包中,到最后看看有多少
f[i]表示當前這個數x之前的數能不能組成i,如果f[x]等于1,那么說明x可以刪了,刪掉即可;如果f[x]是0,那么x不能刪,就按完全背包的方式更新f數組。(官方題解引入)
代碼:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=25002; int a[320]; bool f[maxn]; int tot=0; int n; int main() {int T;cin>>T;while(T--){tot=0;cin>>n;memset(a,0,sizeof(a));for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+1+n);memset(f,0,sizeof(f));f[0]=1;// cout<<f[0]<<endl;for(int i=1;i<=n;i++){if(!f[a[i]]){tot++;//如果這個貨幣獨一不二,不能被組成,則保留// printf("j=%d %d\n",a[i],f[a[i]]); }else continue;for(int j=a[i];j<=maxn;j++){if(f[j-a[i]])f[j]=1;else if(f[j])continue; //當前j能否被構造 // printf("j-a[i]=%d %d\n",j-a[i],f[i-a[i]]); // printf("j=%d %d\n",j,f[j]); }}cout<<tot<<endl;}return 0; }總結
以上是生活随笔為你收集整理的牛客网【每日一题】5月27日题目精讲 货币系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 先行备案去派出所还是公安局(先行备案)
- 下一篇: P3168 [CQOI2015]任务查询