回溯Min选项以通过递归使用1、5和7对数字求和-JAVA

时间:2019-02-05 20:59:48

标签: java recursion backtracking recursive-backtracking

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

例如:

如果n = 10,则由5 + 5(这是2个数字)提供给方案,因此这是最小值,这就是我们得到的结果(与7 + 1 + 1 + 1或5 + 1相对) + 1 +1 + 1 +1表示4或6个较长的选项。

如果n = 6,那么我们得到的结果为2(因为它的总和为1 + 5)。

如果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,但对于应该返回2的n = 6,我得不到。

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

1 个答案:

答案 0 :(得分:0)

想像一棵树,其中每个节点都有一个值,并有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为零

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();
}