Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用递归方法找出所有改变€;5张钞票?_Java_Combinations - Fatal编程技术网

Java 用递归方法找出所有改变€;5张钞票?

Java 用递归方法找出所有改变€;5张钞票?,java,combinations,Java,Combinations,我遇到了一个问题,那就是如何找到所有可能的组合来兑换一张5欧元的钞票。我写了一个程序,它不能得到正确的组合数 我的方法受到以下方面的启发: 500可分为200、200和100。 200可分为100和100。 100可分为50和50 在我编写代码之后,我意识到100也可以分为5到20。我知道这是一个错误,但我不知道如何使用我的方法修复 我的方法是递归的,如下所示,它只检查第一个数字,并相应地对其进行除法 以下是我尝试过的: public class Q1 { public static

我遇到了一个问题,那就是如何找到所有可能的组合来兑换一张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。有人告诉我,除了上面的例子之外,我忘记了其他一些东西。

这里有一些提示,说明为什么你打错了号码:

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

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

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

    例如,x=10。然后:10是最低的数字->将其拆分为5+5->5是最低的数字->将其拆分为2+2+1->2是被忽略后的最低数字->将其拆分为1+1->我们有另一个2,将其拆分为1+1(这等于解决方案5+1+1+1+1,所以现在我们有5,除了1之外只有一个数字。下一个最小的数字是2)->将x=10拆分为2+2+2+2->2是最小的数字;将其拆分为1+1->我们有另一个2

    这可以通过递归方法完成

    代码中出错的内容
    使用10除法示例编写的代码如下所示:

  • 10分为5+5
  • 前5部分分为2+2+1
  • 其中一个被分为1+1
  • 另外两个分为1+1
  • 现在,第二个5从5+5分为2+2+1
  • 其中一个被分为1+1
  • 另外两个分为1+1
  • 给它7种可能性的总分。 尝试将这7种可能性映射到上面的11种可能性,你可以数到10=

    • 10次
    • 5+5一次
    • 5+2+2+1两次
    • 5+2+1+1+1两次
    • 5+1+1+1+1+1+1两次
    并且错过了其他6个选项


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

    10=5+5->评估前5个,然后评估后5个

    这是错误的,因为在这两种情况下,这会导致分布为10=5+评估为5,仅计算在最终分布为10中至少包含一个5的选项(当不评估没有5的分布时,将其计算多次)


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

    • x能等于所有可能的整数吗?->4在代码中不能拆分为2+2
    • 1+1+2与1+2+1和2+1+1是不同的解决方案吗
    (我还没有名声在评论中问这个问题)


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