牛客網 每日一題 5月27日題目精講 貨幣系統

2022-05-05 14:18:10 字數 1901 閱讀 8267

在網友的國度中共有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...