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

变更算法

伍溪叠
2023-03-14

一个典型的变革问题,但有点扭曲。给定一个大的金额和面额,我需要想出总数的方式,其中金额可以使用RECURSION。函数的签名如下

int makeChange(int Amount, int[]面额)

总数

面额-可用面额。

共有1个答案

有骏祥
2023-03-14

关键是要了解在每一点上,你有两个选择:

  1. 使用您正在查看的当前硬币,并在将其从金额减少时递归
  2. 不要使用它,并使其在以后选择时不可用

函数应该返回(1)和(2)的总和。

伪代码:

makeChange(amount,Denominations):
   //stop clauses:
   if (amount == 0) return 1
   if (amount < 0) return 0
   i <- first index of Denominations where Denominations[i] is not zero
   if there is no such i (all are zero):
        return 0
   num1 = makeChange(amount-Denominations[i],Denominations) //recursive call, using Denominations[i]
   temp <- Denominations[i]
   Denominations[i] = 0
   num2 = makeChange(amount,Denominations) //recursive call, not using Denominations[i] - and will never do again
   Denominations[i] = temp //setting environment back to original
   return num1+num2

java代码:

public static int makeChange(int amount, int[] d) { 
    if (amount < 0) return 0;
    if (amount == 0) return 1;
    int i = 0;
    for (i = 0; i < d.length; i++) { 
        if (d[i] != 0) break;
    }
    if (i == d.length) return 0;
    int num1 = makeChange(amount-d[i],d);
    int temp = d[i];
    d[i] = 0;
    int num2 = makeChange(amount,d);
    d[i] = temp;
    return num1 + num2;
}

 类似资料:
  • 我正在用javascript解决“进行更改”的问题: 问题: 给定一定数量的货币,一组硬币面额,计算使用可用面额的硬币制造货币的方法的数量。 例子: 对于金额=4(4),面额=[1,2,3](1,2,2和3),您的程序将输出4-使用这些面额制作4的方法的数量: 1,1,1,1 1¢, 1¢, 2¢ 1¢, 3¢ 2¢, 2¢ 我找到了一个解决方案: 问题: 有人能给我解释一下发生了什么事吗?我试图

  • 给定目标金额和硬币面额列表,我的代码应该找到达到目标金额所需的最少硬币。 示例: > 我们可以从3x253x1做78,所以需要6个硬币 48=2x24,因此2枚硬币就足够了 我们可以从2x161x3中得到35,所以3个硬币就足够了 我用for循环编写了代码,但如何使其递归?

  • 我想做一个递归算法来解决做出改变的问题。是否可以使用非动态方法,不仅返回最小数量的硬币,还返回用于构成给定值的硬币集, 例如,给定值6和硬币组=[1,3,4]。有没有可能创建一个不记忆的递归算法,可以返回最小数量的硬币(2)和硬币集(3,3)? 编辑:这是我当前的算法,但它只返回硬币总数: 将返回3,但我希望它也提供集合{5,5,1}。第二个参数(2)是硬币的数量减去1。

  • 此处所选项目应为项目1、项目4、项目5和项目6(60+60+80+40=240公斤) 实施例2:-袋最多可容纳180公斤的重量 项目1-60公斤、项目2-30公斤、项目3-55公斤、项目4-30公斤、项目5-70公斤、项目6-48公斤

  • 你可以通过声明int,float,char和double类型的变量,来对它们做更多的事情,让我们来熟悉它们吧。接下来我们会在各种数学表达式中使用它们,所以我会向你介绍C的基本算术操作。 int main(int argc, char *argv[]) { int bugs = 100; double bug_rate = 1.2; printf("You have %d

  • 我有以下问题: 有一组项目,每个项目有两个不同的正值a和B。 背包有两个值:totalA和totalB。这是所选项目值A和B的最大和。 我必须找出背包能装的最大物品数是多少。 示例: 输入: 总计A:10,总计B:15 项目1 A:3,B:4 项目2 A: 7,B: 2 项目4 A:2,B:1 项目5 A:4,B:6 输出: 3(项目:2、3、4) 如何使用动态规划来解决此任务?