給定一組硬幣的面額,以及要找零的錢數(shù),計算出符合找零錢數(shù)的最少硬幣數(shù)量。
宜城網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,宜城網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為宜城成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的宜城做網(wǎng)站的公司定做!例如,美國硬幣面額有1、5、10、25這四種面額,如果要找36美分的零錢,則得出的最少硬幣數(shù)應(yīng)該是1個25美分、1個10美分和1個10美分共三個硬幣。這個算法要解決的就是諸如此類的問題。我們來看看如何用動態(tài)規(guī)劃的方式來解決。
對于每一種面額,我們都分別計算所需要的硬幣數(shù)量。具體算法如下:
示意圖
方案4的硬幣總數(shù)最少,因此為最優(yōu)方案。
具體的代碼實現(xiàn)如下:
function minCoinChange(coins, amount) { let result = null; if (!amount) return result; const makeChange = (index, value, min) => { let coin = coins[index]; let newAmount = Math.floor(value / coin); if (newAmount) min[coin] = newAmount; if (value % coin !== 0) { makeChange(--index, value - coin * newAmount, min); } }; const arr = []; for (let i = 0; i < coins.length; i++) { const cache = {}; makeChange(i, amount, cache); arr.push(cache); } console.log(arr); let newMin = 0; arr.forEach(item => { let min = 0; for (let v in item) min += item[v]; if (!newMin || min < newMin) { newMin = min; result = item; } }); return result; }