当前位置: 首页 > 知识库问答 >
问题:

这种硬币兑换问题的解决方案有什么问题?

於意蕴
2023-03-14

这是hackerrank(https://www.hackerrank.com/challenges/coin-change)的硬币更换问题。它要求计算使用给定面值的硬币对N进行更改的方法总数。

例如,有四种方法可以使用面额为1、2和3的硬币兑换4。它们是-{1,1,1,1},{1,1,2},{2,2},{1,3}

我尝试过在java中使用动态编程实现递归解决方案。我的解决方案是基于这样一个想法,对于给定面额的每一枚硬币,我们反复观察是否可以通过选择硬币来达到总数。如果选择当前的硬币导致解决方案,我们更新的方式总数。但是解决方案不起作用。

下面是实现

public static long getWays(long n, long[] c) {
        Map<String, Long> map = new HashMap<String, Long>();
        return fun(n, c, 0, map);
    }
public static long fun(long n, long[] c, int i, Map<String, Long> memo){
    if(n == 0) return 1;
    if(i >= c.length) return 0;
    if(n < c[i]) return 0;
    String key = n + "_" + i;
    if(memo.containsKey(key)) return memo.get(key);
    long ways = fun(n, c, i+1, memo) + fun(n-c[i], c, i, memo);
    memo.put(key, ways);
    return ways;
}

这给了我错误的答案。例如,有5种方法可以使用{2,5,3,6}的硬币对10进行更改,但它返回4作为输出。

我哪里错了?


共有1个答案

颜修真
2023-03-14

乍一看,如果高于剩余值的硬币位于数组中第i个位置之前,您的解决方案似乎会跳过解决方案。考虑n=5和c=[10,5]的情况。答案应该是1。

在代码中,它将进入if语句检查if n

if(n < c[i]) return 0;

将返回0。

 类似资料:
  • 我试图使用贪婪算法来计算在JavaScript中达到一定数量所需的最低硬币数量 返回结果将是一个数组,由每个级别的硬币数量组成 我决定做一个函数来解决这个问题,但它不起作用 calculateChange函数包含两个参数:硬币值数组和金额。 第一步是初始化一个sum变量,该变量显示已调度的更改量。我还将创建一个数组变量,该变量将保存某个硬币的分配次数。 为此,我将迭代coins数组并将所有值设置为

  • 以人民币的硬币为例,假设硬币数量足够多。要求将一定数额的钱兑换成硬币。要求兑换硬币数量最少。 思路说明: 这是用贪婪算法的典型应用。在本例中用python来实现,主要思想是将货币金额除以某硬币单位,然后去整数,即为该硬币的个数;余数则做为向下循环计算的货币金额。 这个算法的问题在于,得出来的结果不一定是最有结果。比如,硬币单位是[1,4,6],如果将8兑换成硬币,按照硬币数量最少原则,应该兑换成为

  • 我有一个练习: 您将获得不同面额的硬币和总金额。请编写一个函数来计算您需要的最少数量的硬币,以弥补该金额。如果硬币的任何组合都无法弥补该金额,请返回-1 例1: 我还谷歌了一个这样的解决方案: 我知道它是关于DP的,但是,我对它很困惑,比如,的含义是什么,为什么要添加,为什么要添加,为什么要添加1? 有人能用简单的英语指出出路吗?

  • 给定一个值N,如果我们想换N美分,并且我们有无限量的S={S1,S2,…,Sm}值的硬币,我们可以用多少种方式来换?硬币的顺序无关紧要。 例如,对于N=4和S={1,2,3},有四种解:{1,1,1,1},{1,1,2},{2,2},{1,3}。所以输出应该是4。对于N=10和S={2,5,3,6},有五个解:{2,2,2,2},{2,2,3,3},{2,2,6},{2,3,5}和{5,5}。所以

  • 这是一个骇人听闻的问题:爱丽丝是一个幼儿园老师。她想给班上的孩子们一些糖果。所有的孩子坐成一行(他们的位置是固定的),每个人根据他(她)在班上的表现有一个评级分数。爱丽丝想给每个孩子至少一颗糖。如果两个孩子挨着坐,那么评分较高的那一个必须得到更多的糖果。爱丽丝想省钱,所以她需要尽量减少给孩子们的糖果总数。 测试数组:n=10,n个元素为[2 4 2 6 1 7 8 9 2 1]。我得到的答案是18

  • 我正在研究Leetcode322:硬币兑换。 您将获得一个整数数组,表示不同面额的硬币,以及一个整数金额,表示总金额。 返回您需要的最少数量的硬币,以弥补该金额。如果这些硬币的任何组合都无法弥补这一数额,则返回-1。 你可以假设每种硬币的数量是无限的。 例子: 输入:硬币=[1,2,5],金额=11 输出: 3 说明:11 = 5 5 1 我选择自上而下的方法,在每次迭代中,我选择一个面额不大于剩