国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

js貪心算法 錢幣找零問題代碼實例

2019-11-19 10:49:53
字體:
來源:轉載
供稿:網友

給定一組硬幣的面額,以及要找零的錢數,計算出符合找零錢數的最少硬幣數量。

例如,美國硬幣面額有1、5、10、25這四種面額,如果要找36美分的零錢,則得出的最少硬幣數應該是1個25美分、1個10美分和1個10美分共三個硬幣。這個算法要解決的就是諸如此類的問題。我們來看看如何用動態規劃的方式來解決。

對于每一種面額,我們都分別計算所需要的硬幣數量。具體算法如下:

  1. 如果全部用1美分的硬幣,一共需要36個硬幣
  2. 如果用5美分的硬幣,則需要7個5美分的硬幣 + 1個1美分的硬幣 = 8個硬幣
  3. 如果用10美分的硬幣,則需要3個10美分的硬幣 + 1個5美分的硬幣 + 1個1美分的硬幣 = 5個硬幣
  4. 如果用25美分的硬幣,則需要1個25美分的硬幣 + 1個10美分的硬幣 + 1個1美分的硬幣 = 3個硬幣

示意圖

方案4的硬幣總數最少,因此為最優方案。

具體的代碼實現如下:

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;}

函數minCoinChange()接收一組硬幣的面額,以及要找零的錢數。我們將上面例子中的值傳入:

const result = minCoinChange2([1, 5, 10, 25], 36);console.log(result);

得到如下結果:

[ { '1': 36 }, { '1': 1, '5': 7 }, { '1': 1, '5': 1, '10': 3 }, { '1': 1, '10': 1, '25': 1 }]{ '1': 1, '10': 1, '25': 1 }

上面的數組是我們在代碼中打印出來的arr的值,用來展示四種不同面額的硬幣作為找零硬幣時,實際所需要的硬幣種類和數量。最終,我們會計算arr數組中硬幣總數最少的那個方案,作為minCoinChange()函數的輸出。

當然在實際應用中,我們可以把硬幣抽象成任何你需要的數字,這個算法能給出你滿足結果的最小組合。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 扎兰屯市| 宜城市| 宁国市| 万州区| 和平县| 马公市| 长海县| 太湖县| 大足县| 凤山县| 乌拉特前旗| 石狮市| 安龙县| 萝北县| 营口市| 沾益县| 宁德市| 遂川县| 手机| 肇源县| 文山县| 武安市| 兴业县| 忻州市| 秭归县| 大埔县| 白银市| 克东县| 德钦县| 丰都县| 进贤县| 扶余县| 云林县| 城固县| 商南县| 西贡区| 南通市| 宜阳县| 荥经县| 股票| 清苑县|