In Java, it might look something like this...
/** Return a list of every sub-list of blocks. * @param blocks list of individual block heights */ ArrayList<ArrayList<Integer>> generateSubsets(ArrayList<Integer> blocks) { return generateSubsets(blocks, blocks.size() - 1); } /** Return a list of every sub-list of blocks[0], ..., blocks[index]. * @param blocks list of individual block heights * @param index index of last block to consider for subsets */ ArrayList<ArrayList<Integer>> generateSubsets(ArrayList<Integer> blocks, int index) { ArrayList<ArrayList<Integer>> subsets; if (index == -1) { subsets = new ArrayList<ArrayList<Integer>>(); subsets.add(new ArrayList<Integer>()); } else { // Generate the list of subsets for every block except the last. subsets = generateSubsets(blocks, index - 1); // Make a copy of every subset in the first half, but with the last // block added to it. int halfSize = subsets.size(); for (int i = 0; i < halfSize; ++i) { subsets.add((ArrayList<Integer>) subsets.get(i).clone()); subsets.get(subsets.size()-1).add(blocks.get(index)); } } return subsets; }