在網友的國度中共有n種不同面額的貨幣,第i種貨幣的面額為a[i],你可以假設每一種貨幣都有無窮多張。為了方便,我們把貨幣種數為n、面額陣列為a[1…n]的貨幣系統記作(n,a)。輸入描述:在乙個完善的貨幣系統中,每乙個非負整數的金額x 都應該可以被表示出,即對每乙個非負整數x,都存在n個非負整數t[i] 滿足a[i] x
t[i] 的和為x。然而,在網友的國度中,貨幣系統可能是不完善的,即可能存在金額x不能被該貨幣系統表示出。例如在貨幣系統n=3,
a=[2,5,9]中,金額1,3就無法被表示出來。
兩個貨幣系統(n,a)和(m,b)是等價的,當且僅當對於任意非負整數x,它要麼均可以被兩個貨幣系統表出,要麼不能被其中任何乙個表出。
現在網友們打算簡化一下貨幣系統。他們希望找到乙個貨幣系統(m,b),滿足(m,b)
與原來的貨幣系統(n,a)等價,且m盡可能的小。他們希望你來協助完成這個艱鉅的任務:找到最小的m。
輸入的第一行包含乙個整數t,表示資料組數。接下來按照如下格式分別給出t組資料。輸出描述:每組資料的第一行包含乙個正整數n。接下來一行包含n個由空格隔開的正整數a[i]。
輸出檔案共t行, 對於每組資料, 輸出一行乙個正整數, 表示所有與(n, a)等價的貨幣系統(m, b)中, 最小的m。示例1
輸入
243
191065
1129
1319
17
輸出
2
5
說明
在第一組資料中,貨幣系統(2, [3,10])和給出的貨幣系統(n, a)等價,並可以驗證不存在m < 2的等價的貨幣系統,因此答案為2。
在第二組資料中,可以驗證不存在m < n的等價的貨幣系統,因此答案為5。
備註:1 <= t <= 20, 1 <= n <= 100, 1 <= a[i] <= 25000
首先,傷感一分鐘,紀念我逝去的oi
我唯一參加過的一屆的noip,讓我永生難忘
我記得當時考完後,有人戲稱為大凱的疑惑
我們來看一下題,先知道什麼是貨幣系統:其實就是這幾種不同面值的錢任意組合出其他錢。
如果乙個貨幣系統中有3,有6,那麼6就可以省略,因為6可以由兩個3組成,這樣我們就可以得到乙個最小貨幣系統,這個貨幣系統是原來的子集,且裡面每種面值都是獨一無二不可代替的,與原本的是等價關係
我們可以從最小面值開始(因為最小面值肯定無法代替),然後面值依次變大
這樣,題意就成了,給你一堆數,每個數可用無數次,問能組成多少數?
這不就是完全揹包問題
我們先排序
然後對前i-1個貨幣進行完全揹包,不能被取代的幣值也加入揹包中,到最後看看有多少
f[i]表示當前這個數x之前的數能不能組成i,如果f[x]等於1,那麼說明x可以刪了,刪掉即可;如果f[x]是0,那麼x不能刪,就按完全揹包的方式更新f陣列。(官方題解引入)
#include
using
namespace std;
typedef
long
long ll;
const
int maxn=
25002
;int a[
320]
;bool f[maxn]
;int tot=0;
int n;
intmain()
else
continue
;for
(int j=a[i]
;j<=maxn;j++)}
cout<}return0;
}
牛客網 每日一題 7月27日題目精講 烏龜棋
時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n 個格仔,每個格仔上乙個分數 非負整數 棋盤第1 格是唯一的起點,第n 格是終點,遊戲要求玩家控...
牛客網 每日一題 5月19日題目精講 比賽
時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld你在打比賽,這場比賽總共有12個題 對於第i個題,你的隊伍有a i 的機率解決她 如果解決不了她呢?由於所有人討論的都很大聲 所以你有b i 的概率從左邊那個隊那裡聽...
牛客網 每日一題 4月14日題目精講 Xorto
傳送時間限制 c c 2秒,其他語言4秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 給定乙個長度為n的整數陣列,問有多少對互不重疊的非空區間,使得兩個區間內的數的異或和為0。輸入描述 第一行乙個數n表示陣列長度 第二行n個整數表示陣列 1 n 10...