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

用递归方法找出所有方法来更改5欧元纸币?

东门令
2023-03-14

我遇到了一个问题,就是如何找到所有可能的组合来改变一张5欧元的纸币。我写了一个程序,不能得到正确的组合数。

我的方法受到以下启发:

500分200、200、100;200分100、100;100分50、50。

在我编写代码之后,我意识到100也可以分为5 20。我知道这是一个错误,但我不知道如何使用我的方法修复。

我的方法是递归的,如下所示,它只检查第一个数字,并相应地对其进行除法。

以下是我尝试过的:


public class Q1 {

    public static int counter;

    public static void main(String[] args) {

        divide(500);
        System.out.println(counter);

    }

    private static void divide(int x) {


        System.out.println("Dividing " + x);


        if(x == 1) {
            return;
        }

        counter++;

        int length = String.valueOf(x).length();

        int fd = Integer.parseInt(Integer.toString(x).substring(0, 1));
        String zeros;

        if(fd != 1) {
            zeros = Integer.toString(x).substring(1, length);
        }else {
            zeros = Integer.toString(x).substring(1, length-1);
        }


        if(fd == 5) {
            divide(Integer.parseInt(2 + "" + zeros));
            divide(Integer.parseInt(2 + "" + zeros));
            divide(Integer.parseInt(1 + "" + zeros));
        }else if(fd == 2) {
            divide(Integer.parseInt(1 + "" + zeros));
            divide(Integer.parseInt(1 + "" + zeros));
        }else if(fd == 1) {
            divide(Integer.parseInt(5 + "" + zeros));
            divide(Integer.parseInt(5 + "" + zeros));
        }


    }

}

例如,使用上面的程序会出现错误

10 = 2 2 2 2 2

我知道像这样的工作解决方案已经存在,但如果可能的话,我希望保持我的方法。

使用该程序找出500美分的组合结果388种方式,其中正确答案为6295435。有些东西告诉我,除了上面的例子,我忘记了其他的东西。

共有1个答案

屠坚壁
2023-03-14

以下是一些关于为什么你会得到错误号码的提示:

为了简单起见,尝试拆分5而不是500。请注意,有4种可能性,即5种=

  1. 5

现在尝试将10除以500。请注意,这可以分为11种不同的方式:10=

  1. 10
  2. 5
  3. 5 2 2 1
  4. 52 11
  5. 5 1
  6. 2
  7. 2 1
  8. 2 1 1
  9. 2 2 1 1
  10. 2 1
  11. 11

此解决方案遵循以下模式:要拆分的数字x已经是答案。通过将其中一个数字拆分为尽可能多的次大数字,将最低数字的数量减少1。总是忽略那些。如果只剩下一个(或多个)数字,请将x拆分为尽可能多的下一个最低数字,然后继续。

例如,x=10。那么:10是最低的数字-

这可以通过递归方法完成。

使用除以10的示例编写的代码如下:

  1. 10分为5分
  2. 前5项分为2 1
  3. 其中一个分为11个
  4. 另外两个被分成11个
  5. 现在,第二个5分为5分为2 1
  6. 其中一个分为11个
  7. 另外两个被分为1

给它7种可能性的总分。尝试将这7种可能性映射到上面的11种可能性,你可以数到10=

  • 10次
  • 5 5一次
  • 5 2 2 1两次
  • 5 2 1 1 1两次
  • 5 1 1 1 1 1两次

并且错过了其他6个选项。

所以假设这个问题可以通过这样的方法来解决:

10 = 5 5 -

是错误的,因为在这两种情况下,这都会导致10=5的分布(5的评估),只计算10的最终分布中至少包含一个5的选项(多次计数,而没有5的分布不会被评估)。

另一个错误是,代码说在实际存在1(1=1)的情况下,不可能存在1的分布。此外,这个问题还不清楚

  • x能等于所有可能的整数吗-

(我还没有名声在评论中问这个问题)。

保留递归方法只能通过一些重大更改来完成。一种可能的方法如上所述。

 类似资料:
  • 我有两个非递归方法,其中一个读取字符串中的总“e”字符,另一个检查 ArrayList 是否按字母顺序排列。 递归方法的定义是方法调用自身。我相信我理解这个概念,但要实现它或将其转换为递归方法确实很困难。我怎样才能将这些方法转化为递归方法,同时我应该如何思考?此外,这是我的另一种方法,它只打印出指定数字大小的数字。 条件方法检查数字的第一个数字(从右起)是否大于第二个数字,并再次检查第二个是否大于

  • 我正在处理我当前的任务,即创建一个LinkedList数据结构,我已经创建了它以及其他方法,它工作得非常好。我正在处理我的最后一个问题,即制作一个toString方法。它应该: toString方法返回列表的字符串表示形式。用逗号分隔每个项目,并用大括号括住这些项目,例如{1,4,7,5}。公共toString方法必须调用私有递归方法来生成以逗号分隔的项目列表。(但您可以在公共方法中添加大括号。)

  • 我目前面临的问题是,我的代码无法解决peg纸牌板的不同变体。我的测试程序测试了4个简单的可解电路板。(1移动解决方案)向上移动一次,向下移动一次,向左移动一次,向右移动一次。我的代码解决了这些问题,同时测试了一个无法解决的电路板。我面临的问题是如何解决更复杂的问题,比如加号、菱形和标准板。 我不太确定如何将递归添加到这个问题中。我在solveHelp方法调用setupMove的末尾添加了它,但这破

  • 我有一个javascript函数,它接受一个数组,并对该数组的每个项执行另一个函数。有很多重复的部分,所以我假设有一种更简单的递归方式来写这个: null null 数组中的每个项要么是字符串,要么是嵌套数组。字符串不必是唯一的,所以我认为我不能使用object和map()来代替。

  • 我在深度优先搜索算法实现的递归方法方面遇到了一些麻烦。这是二叉树照片: 该方法在树的右侧(55、89、144)工作得很好,但是当它来到左侧时,它返回nil,即使它输入“是”。那么,代码有什么问题呢?节点是Node类的一个实例,它具有值(整数)并链接到左右子级(Node类的其他实例),如果它没有来自该侧的子级,则为nil。 下面是方法代码:

  • 我无法找到此练习的正确解决方案,以下是任务: (数组中指定字符的出现次数)编写一个递归方法,用于查找数组中指定字符的出现次数。您需要定义以下两种方法。第二种是递归助手方法。 公共静态int计数(char[]chars,char ch) 公共静态int计数(char[]chars, char ch, int high) 编写一个测试程序,提示用户输入一行中的字符列表和一个字符,并显示该字符在列表中的