2018-08-11

partition problems - Print all subsets with given sum

Given S = {3,1,1,2,2,1}, a valid solution to the partition problem is the two sets S1 = {1,1,1,2} and S2 = {2,3}. Both sets sum to 5, and they partition S. Note that this solution is not unique. S1 = {3,1,1} and S2 = {2,2,1} is another solution.


import java.util.*;

public class KNumberSubset {
private int number;
private int sum;
private LinkedList<Integer> subset;
private int[] numbers;
static LinkedList<LinkedList<Integer>> all=new LinkedList<>();

public KNumberSubset(int[] numbers, int number) {
this.numbers = numbers;
this.number = number;
sum = 0;
subset = new LinkedList<Integer>();
}

public void findSubset(int startPoint, int limit) {
if (sum == number) {
//System.out.println(subset + " :: " + sum);
all.add((LinkedList<Integer>)subset.clone());
//all.add(subset);

} else {
for (int i = startPoint; i < numbers.length; i++) {
sum = sum + numbers[i];
if (sum > limit) {
sum = sum - numbers[i];
break;
}
//subset.add((int) numbers[i]);
subset.add(i);
findSubset(i + 1, limit);
sum = sum - numbers[i];
subset.removeLast();
}
}
}

public static void main(String args[]) {
int[] numbers = { 4,1,1,3,2,1};
Arrays.sort(numbers);
int sum=6;
int number = sum;

KNumberSubset ki = new KNumberSubset(numbers, number);
ki.findSubset(0, number);
LinkedList<LinkedList<Integer>> result=new LinkedList<>();
for(int i=0;i<all.size();i++){
for(int j=i+1;j<all.size();j++){
List<Integer> a1=(LinkedList<Integer>)all.get(i).clone();
List<Integer> a2=(LinkedList<Integer>)all.get(j).clone();
a1.retainAll(a2);
if(a1.isEmpty()){
//System.out.println(all.get(i)+" "+a2);
result.add((LinkedList<Integer>)all.get(i).clone());
result.add((LinkedList<Integer>)a2);
}
}
}
List<Integer> list = new ArrayList<Integer>();
for (int  item: numbers) {
        list.add(item);
    }
System.out.println("Indexes are where = "+list);
        System.out.println("sum="+sum);
System.out.println(result);
result.clear();
all.clear();
number--;
}
}