动态规划(dynamic programming)是一种将复杂问题分解成更小的子问题来解决的优化技术。
用动态规划解决问题时,要遵循三个重要步骤:
- 定义子问题。
- 实现要反复执行来解决子问题的部分。
- 识别并求解出基线条件(不再递归调用的条件->停止点)。
最少硬币找零问题
最少硬币找零问题是硬币找零问题的一个变种。硬币找零问题是给出要找零的钱数,以及可用的硬币面额d1,…,dn及其数量,找出有多少种找零方法。最少硬币找零问题时给出要找零的钱数,以及可用的硬币面额
d1,…,dn及其数量,找到所需的最好的硬币个数。
例如:美国有以下的面额硬币:d1 = 1, d2 = 5, d3 = 10,d4 = 25。
如果要找36美分的零钱,我们可以用1个25美分,1个10美分,和1美分。
如何将这个解答转化成算法。
最少硬币找零的解决方法是找到n所需的最小的硬币数。
function minCoinChange(coins,amount){const cache = [];const makeChange = (value) => {if(!value){return [];}if(cache[value]){return cache[value];}let min = [];let newMin;let newAmount;for(let i = 0; i < coins.length; i++){const coin = coins[i];newAmount = value - coin;if(newAmount >= 0){newMin = makeChange(newAmount);}if(newAmount >= 0 && (newMin.length < min.length - 1 || !min.length) && (newMin.length || !newAmount)){min = [coin].concat(newMin);console.log(`new Min ${min} for ${value}`);}}return (cache[value] = min);}return makeChange(amount);}console.log(minCoinChange([1,5,10,25],36));
题解再补
