繁体   English   中英

子集和解java

[英]Sub set sum solution java

我需要使用recursionbacktracking编写代码,并且没有任何循环可以找到方程式x1+x2+x3 = K所有可能解决方案,其中K是给定数字。 并且x1 , x2, x31 - 10之间的非零正整数。

我的尝试:

public static int subSetSum(int i, int k, int A[]) {
    int sum = A[0] + A[1] + A[2];
    int noOfSolutions = 0;
    if(k - sum < 0 || i >= A.length)
        return 0;
    if(k - sum == 0) {
        System.out.println(A[0] + " + " + A[1] + " + " + A[2]);
        noOfSolutions =+ 1; }
    noOfSolutions = subSetSum(i+1,k,A);
    int newA[] = A;
    newA[i] = A[i]+1;
    noOfSolutions = subSetSum(i,k,newA);
    return noOfSolutions;
}

运行代码我只会得到一个解决方案。 因此,如果尝试找到6所有解决方案,它将只打印1+1+40 (对于没有解决方案)。

  • (1)如果你想添加和赋值运算符是+ = ,不是= + (这将为noOfSolutions分配+1)
  • (2)你不需要一个新的向量,它也将是相同的(A和newA它将具有相同的内存地址,因此其中一个的更改将影响它们)
  • (3)您应该在递归调用后恢复堆栈更改

编辑

  • (4)你应该在解决方案后停止
public static int subSetSum(int i, int k, int A[]) {
    int sum = A[0] + A[1] + A[2];
    int noOfSolutions = 0;
    if(k - sum < 0 || i >= A.length)
        return 0;
    if(k - sum == 0) {
        System.out.println(A[0] + " + " + A[1] + " + " + A[2]);
--(1)-->    noOfSolutions += 1;
--(4)-->    return noOfSolutions;
    }
    noOfSolutions += subSetSum(i+1,k,A);
--(2)-->    A[i] = A[i]+1;
    noOfSolutions += subSetSum(i,k,A);
--(3)-->    A[i] = A[i]-1;
    return noOfSolutions;
}

为例

public static void main(String[] args) {
    System.out.println(subSetSum(0, 4, new int[3]));
}

产量

0 + 0 + 4
0 + 1 + 3
0 + 2 + 2
0 + 3 + 1
0 + 4 + 0
1 + 0 + 3
1 + 1 + 2
1 + 2 + 1
1 + 3 + 0
2 + 0 + 2
2 + 1 + 1
2 + 2 + 0
3 + 0 + 1
3 + 1 + 0
4 + 0 + 0
15

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM