P5020 貨幣系統

2022-08-26 08:00:14 字數 1583 閱讀 8381

在網友的國度中共有 n 種不同面額的貨幣,第 i 種貨幣的面額為a[i],你可以假設每一種貨幣都有無窮多張。為了方便,我們把貨幣種數為 n、面額陣列為 a[1..n] 的貨幣系統記作 (n,a)。

在乙個完善的貨幣系統中,每乙個非負整數的金額 x 都應該可以被表示出,即對每乙個非負整數 x,都存在 n 個非負整數 t[i] 滿足 a[i]×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

2 

4 3 19 10 6

5 11 29 13 19 17

輸出 #1

2   

5

在第一組資料中,貨幣系統(2,[3,10]) 和給出的貨幣系統 (n,a) 等價,並可以驗證不存在 m<2 的等價的貨幣系統,因此答案為 2。 在第二組資料中,可以驗證不存在 m【資料範圍與約定】

對於 100%的資料,滿足 1≤t≤20,n,a[i]≥1。

比較好想的是使用搜尋演算法,相信各位都會,這裡就不多說了。主要講一下使用完全揹包來完成這件事。

根據常識,我們知道 x 只能被比它小的數字組成而不能被比它大的數字組成。

那麼很顯然,我們可以首先對陣列排個序,然後對於每乙個數考慮能不能被它前面的數字所組成。

我們知道如果 x能被前  i 個數組成且組成 x的數當中包含 ai 那麼 (x−ai)也必然能被前  i 個數來組成,那麼我們很容易想到定義 f(x) 表示 x 能否被組成,那麼根據上面的想法顯然有 f(x)=f(x)∨f(x−ai​)。

**:

#include#include#include#include#includeusing namespace std;

const int n=110,m=25010;

int n,t,ans;

int f[m],a[n];

int main ()

for(int j=a[i]; j<=a[n]; j++)

f[j]=f[j]|f[j-a[i]];

} printf("%d\n",ans);

} return 0;

}

P5020 貨幣系統

在的國度中共有 n種不同面額的貨幣,第 i種貨幣的面額為 a i 你可以假設每一種貨幣都有無窮多張。為了方便,我們把貨幣種數為 n 面額陣列為a 1.n 的貨幣系統記作 n,a 在乙個完善的貨幣系統中,每乙個非負整數的金額 x都應該可以被表示出,即對每乙個非負整數 x,都存在 n 個非負整數 t i...

洛谷P5020貨幣系統

這個題打眼看上去可能是乙個數論或者dp,其實我們可以簡化一下題意,即 給定乙個集合 alpha 找到幾個數使得這幾個數可以拼湊起來這個集合裡所有的數,且需要使這些數的個數最小。這樣這個題就不難理解了,首先看到資料範圍,發現暴搜可以騙不少分,但其實這個題暴搜是可以a的,主要就是可以如何使暴搜的速度加快...

洛谷 P5020 貨幣系統(DP)

題意 略。題記 看題目樣例可以看出乙個規律,新貨幣是舊貨幣的子集。意思就是在原貨幣系統中可以找到一些小面額的貨幣去表示乙個大面額的貨幣。證明略 不會證明 dp i 表示面額為i能否用貨幣表示出來,則f i f i f j 時間複雜度 o 2500010020 include include incl...