P5020 貨幣系統

2022-02-19 07:55:50 字數 1392 閱讀 9625

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

在乙個完善的貨幣系統中,每乙個非負整數的金額 x都應該可以被表示出,即對每乙個非負整數 x,都存在 n 個非負整數 t[i] 滿足 a[i]×t[i] 的和為 x。然而, 在網友的國度中,貨幣系統可能是不完善的,即可能存在金額 x 不能被該貨幣系統表示出。例如在貨幣系統 n=3n=3, a=[2,5,9]a=[2,5,9] 中,金額 1,31,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

輸出樣例1:

2

5

思路:我們定義集合a表示(n,a),集合b表示(m,b),根據題意我們可以猜測b∈a,嚴謹的證明詳見洛谷題解。那麼這道題就變成了我們需要尋找乙個集合b,使得其中的每乙個元素都不可以被集合a中的元素表示出來。

這裡我們使用完全揹包,考慮x可以被前i個數表示出來且其中包含a[i],那麼x-a[i]也可以被前i個數表示出來。如此我們用f[x]表示x是否能被表示出來,f[x]=f[x]|f[x-a[i]]。

**:

#include#include

#include

#include

using

namespace

std;

int t,n,a[108

],ans;

int f[25008

];long

long

read()

while(ch>='

0'&&ch<='9')

return x*f;

}int

main()

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

}printf(

"%d\n

",ans);

}return0;

}

P5020 貨幣系統

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

洛谷P5020貨幣系統

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

洛谷 P5020 貨幣系統(DP)

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