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

硬币变化问题的递推解法

余阳秋
2023-03-14

我需要编写一个算法,它接收一个数字和一个数字列表,并从列表中返回可能的数字组合的数量,从而可以创建和数。例如:def coin(5,[1,2,5,6]应该返回数字4,因为列表中有4种可能的组合可以一起创建数字5。下面是我尝试过的代码,但它不起作用。输出是6而不是4,我希望您能帮助我理解为什么。

def coin(n,lst):
    if n<=1:
        return 1
    else:
        total=0
        for i in range(len(lst)):
            change=lst[i]
            if change>n:
                continue
            else:
                result=coin(n-change,lst[i:])
                if result>0:
                    total+=result
        return total
print(coin(5,[1,2,5,6]))

共有2个答案

祁权
2023-03-14
int coinCount( int C[], int m, int n )

    {
        // if n is 0 return 1
        if (n == 0)
        return 1;

        // If n is less than 0 then no solution exists
        if (n < 0)
        return 0;

        // If there are no coins and n is greater than 0, then no solution exists
        if (m <=0 && n > 0)
        return 0;

        return coinCount( C, m - 1, n ) + coinCount( C, m, n-C[m-1] );
    }
朱阳曜
2023-03-14

错误在于基本情况:

    if n<=1:
        return 1

只有当1是允许的硬币之一时,此项才有效。但在递归的情况下,您将在lst[i:::处对列表进行切片,因此并非每次都允许使用所有硬币。有时,1不是允许使用的硬币之一,在这种情况下,有零种方法可以使总数为1,而不是一种方法。要解决此问题,请编写以下内容:

    if n <= 1:
        if n == 0 or n in lst:
            return 1
        else:
            return 0

这是正确的,因为您可以在基本情况下对n进行更改,如果n是0(我们总是可以使0),或者如果n是1并且1是允许的硬币之一。

也就是说,让递归大小写处理1会更简单,所以大小写只需要处理0;这也是正确的:

    if n == 0:
        return 1
 类似资料:
  • 给定一个值N,如果我们想改变为N美分,并且我们有无限量的S={S1,S2,...,Sm}值的硬币,我们有多少种方法可以改变?硬币的顺序并不重要。不过还有一个额外的限制:你只能用正好是K的硬币换零钱。 例如,对于N=4,k=2和S={1,2,3},有两个解:{2,2},{1,3}。所以输出应该是2。 解决方案: 以上是递归解决方案。但是,我需要有关动态规划解决方案的帮助: 让表示与元素和硬币的总和。

  • 我试图用递归来解决硬币兑换问题,遇到了下面的代码。 问题:给定一些面额的无限硬币,计算它们形成给定数量的方式。 输入: 代码: 我理解代码本身,也理解基本情况,但是我不理解它是如何封装递归/解决方案的。 例如,如果我正在求解,我可以说,因此我可以清楚地“看到”递归。在换硬币的例子中,我无法推断出类似的关系。有人能帮我吗?

  • 我试图解决的问题是:给定一个硬币列表和一个总和,找出所有可能的方法来使用这些硬币形成总和(你可以无限时间使用一个硬币),例如:4和[1,2,3]将给出答案[1,1,1,1,1],[1,1,2],[2,2],[1,3](这里有三种类型的硬币,价值为1,2和3)。以下是我对这个问题的尝试: 在这里,我尝试使用动态编程来跟踪我已经尝试过的值。我得到的答案是: 这当然是错误的。程序运行后备忘录的演变为:

  • 这是uva问题的根源。在线法官。组织机构 这个问题基本上是说: 给定N笔必须给的钱!!我们需要找出我们能给多少最低硬币,以及这些硬币的总价值,这样使用n个给定面额给的额外金额就最小了! 例如: 我的问题是: 这里的重叠子问题是什么? 我的意思是: 有重叠的子问题吗<因为我找不到任何。。。

  • 我们得到了一套面额和总额。 每种面额的无限硬币都可以买到 所有面额都是5的幂 我们必须找到总数所需的最低硬币数量。 我想知道解决方案背后的逻辑。提前感谢。

  • 我见过很多硬币更换问题,这个问题很独特。我尝试使用DP和递归,但我无法解决它。 这就是问题所在: 假设给定一个价格,X,其中X是美分,我有5种有限面额的硬币,1,5,10,20,50。我有不同数量的1、5、10、20、50分硬币。我想用最大数量的硬币来确定价格X。我该怎么做?(假设X总是可以用手头的硬币制作) 例如,如果价格X=52,并且 我有三枚一分硬币 我有四枚五分硬币 我有8枚10美分的硬币