给出一个整数和一个和的数组,任务是递归地打印给定数组的所有子集,其总和等于给定的和。
输入: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();
}
}
}