切換
舊版
前往
大廳
主題

ZeroJudge - e333: NOIP2018 Day1.2.貨幣系統 解題心得

Not In My Back Yard | 2019-08-09 23:06:03 | 巴幣 2 | 人氣 111

題目連結:


題目大意:
給定一正整數 T (1 ≦ T ≦ 20),代表有 T 筆的測試資料。每筆測試資料佔兩列,第一列給定一正整數 n (1 ≦ n ≦ 100),代表第二列有 n 個正整數(皆介於 1 ~ 25000 之間)。這 n 個正整數代表一貨幣系統的幣值。

求最少需要幾種幣值就可以表示出原本 n 個幣值所能表示的金額?

以範例輸入第一個測資為例:6 = 3 + 3 、 19 = 10 + 3 × 3 ,因此最少需要 3 、 10 這兩個幣值即可表示出原本可表示的金額。



範例輸入:
2
4
3 19 10 6
5
11 29 13 19 17


範例輸出:
2
5


解題思維:
假設給定的最大幣值為 M 。先將 1 ~ M 之間所有可湊出的金額之方法數先算出來(利用這題的方法)。

接著,用一迴圈從 1 開始到 M 為止,看是否有金額的表示方法數為一種,而且無法以比其值小的幣值表示出來。則此金額即是必需的幣值之一。

最後看所需的幣值之數量為多少,即是所求。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

大大的程式碼貼錯了窩!
2019-10-30 23:39:20
Not In My Back Yard
感謝糾正。
2019-10-30 23:54:14
心彩
為什麼只需要檢查到最大幣值 是只要刪掉能被其他幣值湊出來的幣值 就是答案嗎?
2023-05-24 09:03:04
Not In My Back Yard
對於為何只需要檢查到最大幣值之問題:你可以想一下檢查 M 和 2M 、3M 等有沒有差別(同理,檢查 M - 1 和 2M - 1 等以此類推)。

對於答案之問題:是的,概念上是如此。
2023-05-24 12:06:30
心彩
我就只檢查 每個硬幣能不能被其他硬幣湊出 所以不需要考慮要湊多少的上限值的問題
2023-05-24 12:54:42
Not In My Back Yard
我會在文章說求幣值 1 ~ M 的湊法是因為有一個模板可以拿來用(參見文章裡的鏈結),這樣說明可以變短一點。

而如果你從每個幣值能不能被其他幣值湊出出發,可能會通往深度優先搜尋(Depth First Search,DFS)+ memorization 的方向前進,最後還是會通向把 1 ~ M 的幣值湊法(準確來說,你「直接」地找到了那些可以被這些幣值湊出來的金額。而文章的方法是「間接」地找到)都求出來的情境。
2023-05-24 20:16:30
Not In My Back Yard
如果你覺得下面的方法比較直觀,當然贊同,我不可能去反對;而我是習慣了文章裡的作法,幣值系列的問題(及其變體)我都經常會往這個作法去想。
2023-05-24 20:21:21
心彩
我照著我上面想的 是AC了 也看了你的做法有些不同 只是想確認一下想法是否無誤
2023-05-24 20:24:37
Not In My Back Yard
想法是沒有錯的。而這表示你已經可以自行解出這類的問題了,加上你現在知道了這類問題的兩種解法(你的和我的)。恭喜。
2023-05-24 20:28:41
Not In My Back Yard
問個跟這題不相關的問題:「小王的積木 again」那題有任何問題嗎?還是還正在思考?
2023-05-24 20:29:39
心彩
有點複雜 還在研究 哈哈
2023-05-24 20:31:47
Not In My Back Yard
沒事,我也是看別人的提示才想到的。會複雜是因為這個作法把原本的邏輯全部塞在位元運算裡了。
2023-05-24 20:34:19
Not In My Back Yard
慢慢想吧,反正不急。

就像我有一題被我放置了很久(以前的我不會壓常數,也不會黑魔法),最後又寫了幾次之後(中途還被 Zerojudge 的編譯器陰了一兩次)才過。沒記錯的話,時間跨度是 4 年(當然,不是 4 年每天都在想,真的只是偶爾拿出來寫)。
2023-05-24 20:37:31

更多創作