首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用memoization实现最小硬币金额的零钱?

使用memoization实现最小硬币金额的零钱是一种优化算法的技术,用于解决在给定硬币面额的情况下,找零金额的最小硬币数量。

首先,我们需要定义一个递归函数来实现memoization。这个递归函数将会通过存储已经计算过的结果来避免重复计算,以提高运行效率。

在这个问题中,我们可以将memoization的过程看作是一个查找表,其中键是目标金额,值是最小硬币数量。每次递归调用时,我们可以先检查这个查找表,如果已经有了目标金额的最小硬币数量,直接返回该值,避免重复计算。

接下来,我们需要确定递归函数的终止条件。当目标金额为0时,表示已经找到了最小硬币数量,直接返回0即可。当目标金额小于0时,表示无法凑出该金额,返回一个较大的数值作为标识。

对于每个目标金额,我们可以遍历硬币面额,对每个面额进行递归调用,然后选择最小的硬币数量,再加1作为当前目标金额的最小硬币数量。最后,将最小硬币数量存入查找表,并返回结果。

下面是使用JavaScript实现的示例代码:

代码语言:txt
复制
// memoization查找表
const memo = {};

function coinChange(coins, amount) {
  // 检查查找表
  if (amount in memo) {
    return memo[amount];
  }

  // 终止条件
  if (amount === 0) {
    return 0;
  }

  if (amount < 0) {
    return Infinity;
  }

  let minCoins = Infinity;

  // 遍历硬币面额
  for (let i = 0; i < coins.length; i++) {
    const coin = coins[i];
    const remainingAmount = amount - coin;

    // 递归调用
    const result = coinChange(coins, remainingAmount);

    // 更新最小硬币数量
    minCoins = Math.min(minCoins, result + 1);
  }

  // 存储结果
  memo[amount] = minCoins;

  return minCoins;
}

// 示例用法
const coins = [1, 2, 5];
const amount = 11;
const minCoins = coinChange(coins, amount);
console.log(`找零${amount}元需要的最小硬币数量为:${minCoins}`);

这里的示例代码使用了JavaScript语言来实现,硬币面额的数组为[1, 2, 5],目标金额为11元。你可以根据实际情况调整这些值。

在腾讯云的产品中,与云计算相关的产品包括云服务器、对象存储、云数据库等。关于这些产品的具体信息和介绍,可以参考腾讯云的官方文档:腾讯云产品与服务

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++ 不知算法系列之深入动态规划算法思想

:"<< db[i]<<endl; } return 0; } 输出结果: 2.2 找零钱 2.2.1 问题描述 给你k种面值硬币,面值分别为c1, c2 ... ck,每种硬币数量无限,再给一个总金额...amount,问最少需要几枚硬币凑出这个金额,如果不可能凑出,算法返回 -1 。...比如说k = 3,面值分别为 1,2,5,总金额amount = 11。那么最少需要 3 枚硬币凑出,即 11 = 5 + 5 + 1。...原理很简单,对于 11 分钱零钱而言,可以先拿出一枚 1分硬币,也可以先拿出一枚5分硬币,或者是拿出一枚 10分硬币,然后再计算剩下钱需要找回多少硬币。...总结 如果问题都可以使用动态规划实现,则问题字面描述可能形形色色,但问题内在一定会具有相似性。如找零钱问题就可以转化成背包问题。

48210

动态规划: 给我个机会,我再兑换一次零钱

零钱兑换 题目链接:https://leetcode-cn.com/problems/coin-change/ 给定不同面额硬币 coins 和一个总金额 amount。...编写一个函数来计算可以凑成总金额所需最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币数量是无限。...dp[j] 要取所有 dp[j - coins[i]] + 1 中最小。...代码如下: vector dp(amount + 1, INT_MAX); dp[0] = 0; 确定遍历顺序 本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币最小个数。。...本题钱币数量可以无限使用,那么是完全背包。所以遍历内循环是正序 综上所述,遍历顺序为:coins(物品)放在外循环,target(背包)在内循环。且内循环正序。

48810
  • 局部最优解算法-贪心算法详解

    以下是一些贪心算法常见应用场景:找零钱问题: 例如硬币找零问题,选择最大面值硬币直到凑够总金额。...霍夫曼编码(Huffman Coding): 在数据压缩中,使用贪心算法构建最优二进制前缀树,以实现对不同字符高效编码。...请设计一个算法实现使用最少数量硬币凑出目标金额。贪心算法思路:排序: 首先,按硬币面值降序排列硬币,以确保每次选择使用面值最大硬币。...贪心选择: 从硬币面值数组中选择面值最大硬币,尽可能多地使用这个硬币,直到凑够或超过目标金额。更新剩余金额: 在每一步中,更新剩余金额,即目标金额减去已经使用硬币价值。..."无法凑出目标金额"); } }在这个例子中,贪心算法思路体现在从硬币面值数组中选择面值最大硬币,尽可能多地使用这个硬币直到凑够目标金额

    52611

    零钱兑换

    零钱兑换 2. 描述 给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。...5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = [2], amount = 3 输出: -1 说明: 你可以认为每种硬币数量是无限...实现方法 3.1 方法 1 3.1.1 思路 确定 base case,目标金额为 0,返回 0; 确定【状态】,即原问题和子问题中会变化变量。...毫无疑问,此时【状态】为目标金额 amount; 确定【选择】,导致【状态】产生变化行为。设么会导致目标金额发生变化?答案是硬币,没选择一枚硬币,就会导致目标金额减少。...<= amount; i++){ // 数组初始值也为 amount + 1 dp[i] = amount + 1; // 内层循环循环求所有选择最小

    20130

    八十九、动态规划系列背包问题之完全背包

    示例 2: 输入: n = 13 输出: 2 解释: 13 = 4 + 9 首先,明确dp,然后找dp转移方程。 这里,dp[i]:表示完全平方数和为i 最小个数。...给定不同面额硬币 coins 和一个总金额 amount。...编写一个函数来计算可以凑成总金额所需最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。...# 第一步:定义dp数组或变量,首先明确题目说每种硬币数量是无限,但是会给定一个固定 amount 金额,我们需要用最少硬币数凑出这个金额,如果是01背包问题就是[0]开始; #...return -1 return dp[-1] 「至此完全背包就到这里结束了,完全背包注意dp定义,求最大还是最小,完全背包关键词就次数是无限」 - END

    30730

    【动态规划背包问题】强化「换元一维优化」技巧

    给定不同面额硬币和一个总金额。 写出函数来计算可以凑成总金额硬币组合数。 假设每一种面额硬币有无限个。...示例 2: 输入: amount = 3, coins = [2] 输出: 0 解释: 只用面额2硬币不能凑成总金额3。...零钱兑换 中,我们求是「取得特定价值所需要最小物品个数」。 对于本题,我们求是「取得特定价值方案数量」。 求东西不一样,但问题本质没有发生改变,同样属于「组合优化」问题。...对于第 个硬币我们有两种决策方案: 不使用硬币使用硬币:由于每个硬币可以被选择多次(容量允许情况下),因此方案数量应当是选择「任意个」该硬币方案总和: 代码: class Solution...零钱兑换」 和 本篇「518. 零钱兑换 II」本质是一样。 之所将两题分开成两篇【练习】,主要是为了加强大家对于「一维优化」熟练度。

    1.1K62

    每日手撕一道算法题-322.零钱兑换

    每日手撕一道算法题-322.零钱兑换 322. 零钱兑换 题目: 给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。...如果没有任何一种硬币组合能组成总金额,返回 -1。...凑11最少硬币数 = 凑10最少硬币数/凑9最少硬币数/凑6最少硬币数 中最少那个 凑10最少 = 凑9最少 / 凑8最少 / 凑5最少 最少那个 依次循环 转成正向思路是,开辟长度...直接使用剩余值结果 + 1即可。然后去 这些最少那个。就是凑2最优解。 后面的依次这样。 直到11号索引结束。如果11号索引不是我们一开始赋初值,则说明有答案,返回答案。...成了最小值返回回去了。

    71740

    【动态规划算法练习】day16

    零钱兑换 1.题目简介 322. 零钱兑换 给你一个整数数组 coins ,表示不同面额硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需 最少硬币个数 。...如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币数量是无限。...j所需要硬币数 dp[0] = 0;//总金额为0的话,所需硬币数为0 for(int i = 0;i < coins.size(); ++i) {...零钱兑换 II 1.题目简介 518. 零钱兑换 II 给你一个整数数组 coins 表示不同面额硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额硬币组合数。...如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额硬币有无限个。 题目数据保证结果符合 32 位带符号整数。

    17130

    力扣每日一刷(2023.9.14)

    计算并返回可以凑成总金额所需 最少硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币数量是无限。..., 而本题是返回可以凑成总金额所需最少硬币个数 所以这两道题在递推公式上略有不同。...同时, 因为对于数组中银币数量是无限制, 所以我们可以一直使用同一个, 所以在内层遍历背包时候需要正序遍历, 这样就可以保证同一个硬币被多次使用了。...注意: 因为要获取最少硬币个数 ,所以在初始化dp数组时候需要将其赋予最大值, 这样才能再每次递推时候获取最小值(也就是最少使用硬币个数) 对于dp[0]初始化,这里给dp[0] = 0,按照题意总金额为..., 所以我们在初始化dp[i]时候, 需要将其赋值为MAX_VALUE, 这样才能实现min(dp[j],dp[j-i*i] + 1)时候取最小值。

    10110

    贪心算法

    引例 [找零钱] 一个小孩买了价值少于1美元糖,并将1美元钱交给售货员。售货员希望用数目最少硬币找给小孩。假设提供了数目不限面值为2 5美分、1 0美分、5美分、及1美分硬币。...售货员分步骤组成要找零钱数,每次加入一个硬币。选择硬币时所采用贪婪准则如下:每一次选择应使零钱数尽量增大。...为保证解法可行性(即:所给零钱等于要找零钱数),所选择硬币不应使零钱总数超过最终所需数目 引例分析 为使找回零钱硬币最小,不考虑找零钱所有各种方案,而是从最大面值币种开始,按递减顺序考虑各币种...,先尽量用大面值币种,只当不足大面值币种金额才会去考虑下一种较小面值币种。...例如,在付款问题中,已付出货币构成解集合。 (3)解决函数solution:检查解集合S是否构成问题完整解。例如,在付款问题中,解决函数是已付出货币金额恰好等于应付款。

    1.5K20

    动态规划详解(修订版)

    一般使用一个数组充当这个「备忘录」,当然你也可以使用哈希表(字典),思想都是一样。...二、凑零钱问题 先看下题目:给你k种面值硬币,面值分别为c1, c2 ... ck,每种硬币数量无限,再给一个总金额amount,问你最少需要几枚硬币凑出这个金额,如果不可能凑出,算法返回 -1 。...然后确定dp函数定义:函数 dp(n)表示,当前目标金额是n,至少需要dp(n)个硬币凑出该金额。 然后确定「选择」并择优,也就是对于每个状态,可以做出什么选择改变当前状态。...3、dp 数组迭代解法 当然,我们也可以自底向上使用 dp table 来消除重叠子问题,dp数组定义和刚才dp函数类似,定义也是一样: dp[i] = x表示,当目标金额为i时,至少需要x枚硬币...列出动态转移方程,就是在解决“如何穷举”问题。之所以说它难,一是因为很多穷举需要递归实现,二是因为有的问题本身解空间复杂,不那么容易穷举完整。

    58350

    【愚公系列】2023年12月 五大常用算法(三)-动态规划算法

    由于动态规划不包含回溯过程,因此只需使用循环迭代实现,无须使用递归。在以下代码中,我们初始化一个数组 dp 来存储子问题解,它起到了记忆化搜索中数组 mem 相同记录作用。...("不超过背包容量最大物品价值为 " + res); } } 5.2 零钱兑换问题 给定 (n) 种硬币,第 (i) 种硬币面值为 (coinsi - 1) ,目标金额为 (amt) ,每种硬币可以重复选取...,问能够凑出目标金额最少硬币个数。...("凑到目标金额所需最少硬币数量为 " + res); } } 5.3 零钱兑换问题 II 给定 (n) 种硬币,第 (i) 种硬币面值为 (coinsi - 1) ,目标金额为 (amt)...,每种硬币可以重复选取,问在凑出目标金额硬币组合数量。

    24443

    LeetCode-322-零钱兑换

    # LeetCode-322-零钱兑换 给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。...,定义 F(S):组成金额S所需最少硬币数量 [c0,......假设我们知道F(S),即组成金额S最少硬币数,最后一枚硬币面值是C。...其中cj代表是第j枚硬币面值,即我们枚举最后一枚硬币面额是cj,那么需要从i-cj这个金额状态F(i-cj)转移过来,再算上枚举这个硬币数量1贡献,由于要硬币数量最少,所以F(i)为:前面能转移过来状态最小值加上枚举硬币数量...当i<0时,忽略F(i) F(i) 最小硬币数量 F(0) 0 //金额为0不能由硬币组成 F(1) 1 //F(1)=min(F(1-1),F(1-2),F(1-5))+1=1 F(2) 1 //F(

    54520

    本周小结!(动态规划系列五)

    周三 动态规划:322.零钱兑换给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数(每种硬币数量是无限)。...本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币最小个数。。 所以本题并不强调集合是组合还是排列。...你需要让组成和完全平方数个数最少(平方数可以重复使用)。 如果按顺序把前面的文章都看了,这道题目就是简单题了。dp[i]定义,递推公式,初始化,遍历顺序,都是和动态规划:322....我这里做一下总结: 求组合数:动态规划:518.零钱兑换II 求排列数:动态规划:377. 组合总和 Ⅳ、动态规划:70. 爬楼梯进阶版(完全背包) 求最小数:动态规划:322....零钱兑换、动态规划:279.完全平方数 此时我们就已经把完全背包遍历顺序研究透透了!

    62920

    刷题第10篇:从完全平方到零钱兑换

    1、解决思路 不难看出,这道题目的状态转移方程为:nums[n] = Math.min(nums[n],nums[n - i* i] + 1),我们可以使用迭代方法,不断迭代调用之前每一个数字平方数之和最小个数...=0,则代表已经被初始化了,就可以按照上面的迭代方式取最小值了。...T322--零钱兑换【中等题】 题目描述 ?...题目描述 简言之,使用最少硬币数量,兑换成给定金额。 1、解决思路 我们对比一下上面的完全平方数题目,会惊奇发现,其实两者在本质上是完全一样呀!哈哈!...我们可以将小于给定目标数完全平方数,当做这道题目的硬币面额集合,经过这样转换,我们是不是就完全一样啦! 当然,我们还是可以换一种算法实现方式

    27220
    领券