private boolean computeSubsetSum(int[] num, int target,
			ArrayList<ArrayList<Integer>> sol, ArrayList<Integer> current,
			int index) {
		if (index == num.length && target != 0 || target < 0) {
			return false;
		}
		if (target == 0) {
			if (!sol.contains(current)) {
				ArrayList<Integer> validSubset = new ArrayList<Integer>(
						current.size());
				for (Integer i : current) {
					validSubset.add(i);
				}
				sol.add(validSubset);
			}
			return true;
		}
		ArrayList<Integer> current2 = new ArrayList<Integer>(current.size());
		for (Integer i : current) {
			current2.add(i);
		}
		current2.add(num[index]);
		boolean center = computeSubsetSum(num, target - num[index], sol,
				current2, index);
		boolean left = computeSubsetSum(num, target - num[index], sol,
				current2, index + 1);
		boolean right = computeSubsetSum(num, target, sol, current, index + 1);
		return left || center || right;
	}