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

回溯最小选项,通过递归使用1、5和7求和一个数字

冉昊
2023-03-14

我想创建一个递归函数,返回使用数字1、5和7创建特定数字的最小选项(固定预定数字)。重要的是,这只是由没有循环的递归完成的。

例如:

如果n=10,则该方案由5 5给出,即2个数字,因此这是最小值,这是我们将得到的结果(与7 1 1或5 1 1相反,它是4或6个更长的选项)。

如果n=6,那么我们得到的结果是2(因为它是15的和)。

如果n=5(或7或1),那么我们得到的结果是1(因为它只由数字给出)。

class TEST { 

static int countMin( int S[], int m, int n ,int min) 
    { 
        if (n == 0) 
            return 1;      
        if (n < 0) 
            return 0; 
        if (m <=0 && n >= 1) 
            return 0; 
        return Math.min(min,countMin( S, m - 1, n ,min-1) + countMin( S, m, n-S[m-1],min-1 )); 
    } 

public  static int f(int n)  {
      int arr[] = {1, 5, 7};  
      return countMin(arr, arr.length, n,n);
} 

    public static void main(String[] args) 
    { 
        int n = 10;
        System.out.println("The number "+n+ " - " + f(n) + " minimum options to create");
        int n2 = 7;
        System.out.println("The number "+n2+ " - " + f(n2) + " minimum options to create"); 
        int n3 = 6;
        System.out.println("The number "+n3+ " - " + f(n3) + " minimum options to create");

    } 

} 

对于n=10和n=5,我得到正确的结果,但对于n=6,我得不到正确的结果,n=6应该返回2。

*我使用了以下链接:https://www.geeksforgeeks.org/coin-change-dp-7/

共有1个答案

东郭良弼
2023-03-14

设想一棵树,其中每个节点都有一个值,并且有3个子节点,其值分别递减7、5和1

因此,节点总数为15的子节点的值为8、10、14

我们可以从第一个节点开始,计算每个级别,当我们发现一个值为0的孩子时停止。如果一个子节点的值小于0,我们也会停止查看它。

例如,对于10:

                10
            /    |    \
        3        5       9
      / | \    / | \   / | \
    -4 -2 2   -2 0 4   2 4 1

我们在2号深度发现了0号

private static int calculate(int total, int depth) {
    if (total == 0)
        return depth;
    else {
        int i = total - 7  >= 0 ? calculate(total - 7, depth+1) : Integer.MAX_VALUE;
        int j = total - 5  >= 0 ? calculate(total - 5, depth+1) : Integer.MAX_VALUE;
        int k = total - 1  >= 0 ? calculate(total - 1, depth+1) : Integer.MAX_VALUE;
        return Collections.min(Arrays.asList(i, j, k));
    }
}

int n = 10;
System.out.println("The number "+n+ " - " + calculate(n, 0) + " minimum options to create");
n = 7;
System.out.println("The number "+n+ " - " + calculate(n, 0) + " minimum options to create");
n = 6;
System.out.println("The number "+n+ " - " + calculate(n, 0) + " minimum options to create");
n = 18;
System.out.println("The number "+n+ " - " + calculate(n, 0) + " minimum options to create");

输出这个

The number 10 - 2 minimum options to create
The number 7 - 1 minimum options to create
The number 6 - 2 minimum options to create
The number 18 - 4 minimum options to create

编辑:同样的时髦的lambda风格:

private static int calculate(int total, int depth) {
    return total == 0 ? 
        depth : 
        Stream.of(7, 5, 1)
              .map(i -> total - i  >= 0 ? calculate(total - i, depth+1) : Integer.MAX_VALUE)
              .min(Integer::compare)
              .get();
}
 类似资料:
  • 我编写了一个算法,用于返回一组数字的子集是否将使用回溯和递归(返回真/假)与给定目标求和 例如:{5,2,3,6},目标为8== 我想修改我的算法,以便它包括集合中可能存在的所有5。我很难用回溯和递归来解决这个问题。任何建议都不胜感激 例如:{5,2,3,6}目标8== 我写了一个算法,递归地包含一个数字并检查总和,然后从总和中省略该数字,但我不知道如何修改我的算法,只选择某个数字并将其包含在总和

  • 回溯和递归有什么区别?这个程序是如何运作的?

  • 我正在开发高级培养皿网络编辑器/模拟器。首先,这里有一些词汇 圆圈=位置 矩形=过渡 就地整数 = 标记 过渡状态=防护 我被困在通过过渡的守卫。守卫是一个条件,如果你想执行转换,这需要是真的。我知道我应该以某种方式使用回溯,但我不知道在程序开始之前进入过渡的位置数,所以我不能使用循环,因为我不知道我需要多少个循环。 所以,我想从第一位获取第一个令牌,从第二位获取第一令牌,然后尝试通过守卫,如果通

  • 那么我如何使用这个pair类和我的方法来找到最小值和最大值。

  • 我的问题是,当一个9不能正确添加时,该方法会中断。不知何故,我不知道如何让它回到前一点,并向上数,这将创建一个新的“路径”,所以我想如果我做对了,一切都应该很好。我仍然在使用递归:-/ 正如我所知,我认为Sudokurecrect()做了它应该做的事情。编辑:您可以忽略布尔测试。我知道我不使用它,我试着想一些东西,但显然我不知道如何使用它。 输出为 在那之后,不管检查哪个变体。所以问题是一样的。

  • 我对编码还是很陌生的,我正在尝试一些稍微困难的主题,例如修改数独递归回溯程序的解决方案。最初的解决方案是针对大小为3x3的数独,我希望我的解决方案可以与正常大小的数独(9x9)一起使用。3x3解决方案在这里找到。 我觉得我对算法非常了解:对于网格中的每个列表(包含该单元格的可能值),在每一步尝试每个数字,确保电路板仍然有效,移动到下一个列表,分配一个可能的数字直到其有效,等等。如果当前电路板不正确