E-tutor [程式設計][C_MM080-易] 音樂CD盒

簡介

題目來源:e-tutor平台
[C_MM080-易] 音樂CD盒

這個題目大家第一眼看時,可能會覺得很亂,分成兩種 CD 盒,兩種 CD 盒的價錢與容量也都不盡相同,而在題目只給有多少片 CD 的情況下,詢問到底該怎麼裝才會最省錢,那我們該怎麼找出最省錢的方法呢?

讓我們先了解題目內容

問題描述:

小明是個很喜歡聽音樂的人,他擁有很多音樂 CD ,現在他想要買 CD 盒來裝 CD 。市面上只有兩種 CD 盒,一種可以裝 n1 片並且售價 d1 元,另一種可以裝 n2 片並且售價 d2 元。小明希望買到的 CD 盒在使用上都是裝滿的,而且希望花最少的錢來買。現在請你幫小明寫一個程式來決定小明該買這兩種盒子各多少個才好。

Input:

輸入總共有三列資料。第一列是輸入一個正整數 N (小明的 CD 數),第二列是輸入正整數 n1d1 ,第三列是輸入正整數 n2d2 , (1 ≤ N n1d1n2d2 ≤ 1000000) 。

Output:

輸出為一列資料,包含兩個大於等於零的整數分別代表兩種盒子買的數量,如果找不到滿足題意的解,就輸出 ”false” 。

範例:

解題想法:
兩種 CD 盒到底該各買多少個才能分配完所有的 CD,可以設定雙重迴圈,來記錄兩種 CD 盒取或不取的紀錄,並且把所有的可能都記錄下來,再來找取最佳的組合。
※以下把兩種 CD 盒稱為 A 與 B

第一步、要先處理輸入,宣告題目所需的條件

1. CDnumber 為 CD 總數

2. n1 、 n2 分別為兩種 CD 盒的容量

3. d1 、 d2 分別為兩種 CD 盒的價錢

這裡多設置了一個之後會使用到的計數器 count
使用 vector 功能
建立了 3 個一維陣列,分別用來儲存 A、B 兩種 CD 盒的數量以及最後花費的價錢
接著輸入題目要求的變數

第二步、找尋所有可能的組合

設置雙重迴圈,來列舉所有的組合

第一個迴圈:A 種 CD 盒從 0 個開始,直到大於 n1 / CDnumber 時停。

第二個迴圈:B 種 CD 盒從 0 個開始,直到大於 n2 / CDnumber 時停。

那為什麼要把範圍鎖定在 n1 / CDnumber 和 n2 / CDnumber ?

舉例來說,假設 CD 總數 CDnumber 為 4 片

A 種 CD 盒可以裝 1 片CD,B種CD盒能裝 2 片CD

那麼考慮在只使用其中一種 CD 盒的情況下只有 2 種組合
這樣設定就不會使迴圈拿取太多某類的 CD 盒
避免所有 CD 都用某類 CD 盒裝,卻還有裝不滿的情況發生

那麼迴圈裡該放什麼?

第三步、篩選所有的組合



列舉所有組合的途中,若有可以剛好把 CD 總數裝完的組合

就設定變數 price 把這個組合的價錢計算出來

分別把 A、B 種 CD 盒各需要幾個與組合的價錢,存入一開始用 vector 所設定的一維陣列中

並讓計數器 count 加一

第四步、判斷


判斷計數器 count

如果所有組合中沒有一組剛好可以完全裝滿所有 CD 的話

count 就會為 0,並且輸出”false”

不符合以上結果的話,就列印出答案

但可以剛好完全裝滿所有CD的組合,可能不止一種

因此要從我們所存取的資料中,找尋最便宜的組合

第五步、找尋最佳的組合並印出答案

宣告 minn1、minn2、minprice 三個變數

分別用來記錄最佳組合的 A、B 盒數與最小價錢

而最小價錢在還不知道的情況下就以存價錢陣列中的第一項為預設

設定一個迴圈

使最小價錢從所有可能組合中價錢的陣列

一個一個比較,如果有更便宜的組合,就使用 minn1、minn2 紀錄

並且取代掉 minprice

最後迴圈跑完,輸出 minn1、minn2 就完成了!

完整程式碼如下

留言

這個網誌中的熱門文章

E-tutor [程式設計][C_AR183-易] 數字跑馬燈

E-tutor [程式設計][C_CH10-中] The 3n + 1 problem

E-tutor [程式設計][C_MM244-難] 複數的加減乘法