打印给定总和的所有子集

时间:2018-07-13 09:03:06

标签: java recursion

给出一个整数和一个和的数组,任务是递归地打印给定数组的所有子集,其总和等于给定的和。

输入:arr [] = {2,3,5,6,8,10}

sum = 10

输出:

5 2 3

2 8

10

我尝试了一些操作,请看一下。我的代码无法产生正确的输出。在运行代码时,它没有输出,但也没有错误和警告显示。我不知道我的方法在哪里出错。

k是总和

si是起始索引

public class returnSubsetOfsumK {


private static int[][] subsetsSumK(int input[], int k,int si){      
    //base case
 if(si == input.length ) {
        if(k==0) {
            int ans[][] = {{}};
            return ans;
        }else {
            int ans[][] = {};
            return ans;
        }
    }

    //case 1

    int temp1[][] = subsetsSumK(input, k-input[si], si+1);
    if(temp1.length==0) {
        int ans[][] = {};
        return ans;
    }

    //appending input[si] in output

    int temp3[][] = new int[temp1.length][];

    for(int i = 0;i<temp1.length;i++) {
        temp3[i] = new int[temp1[i].length+1];

    }

    for(int i = 0;i<temp3.length;i++) {
        for(int j = 0;j<temp3[i].length;j++) {
            if(j==0) {
                temp3[i][j] = input[si];
            }else {
                temp3[i][j] = temp1[i][j-1];
            }
        }

    }




    //case 2

    int temp2[][] = subsetsSumK(input, k, si+1);

    if(temp2.length==0) {
        int ans[][] = {};
        return ans;
    }


    //Final Output to add temp3 and temp2;
    int output[][] = new int[temp3.length+temp2.length][];

    for(int i = 0;i<temp3.length;i++) {
        output[i] = new int[temp3[i].length];
    }
    for(int i = temp3.length;i<output.length;i++) {
        output[i] = new int[temp2[i-temp3.length].length];
    }


    for(int i = 0;i<temp3.length;i++) {
        for(int j = 0;j<temp3[i].length;j++) {
            output[i][j] = temp3[i][j];
       }  
    }

    for(int i = temp3.length;i<output.length;i++) {
        for(int j = 0;j<output[i].length;j++) {
            output[i][j] = temp2[i-temp3.length][j];
         }
    }



    return output;
}



public static int[][] subsetsSumK(int input[], int k) {
    // Write your code here
         return subsetsSumK(input, k, 0);

    }





public static void main(String[] args) {
    // TODO Auto-generated method stub

    int input[] = {2,1,3,2};
    int out[][] = subsetsSumK(input, 4); 
    for(int i = 0;i<out.length;i++) {
        for(int j = 0;j<out[i].length;j++) {
            System.out.print(out[i][j]);
         }
        System.out.println();
    }

}

}

0 个答案:

没有答案