Better way to create samples
Your solution requires that you create a new Vector for every combination. You are right that there is no better algorithm. The way you have it implemented though, is not as efficient as it should be.

Float should be a primitive.... float. Using a Float object instead of the primitive float will require a lot more memory than you should need.

The Java Vector class is a synchronized implementation. Use of the Vector class is discouraged. If you need synchronization then use one of the java.util.concurrent.* classes. I would also use an array-of-primitives for the input population too):

private static void distribuzioneInBlocco(int n, int firstElementConsidered, float[] population, float[] sample){
    // not sure what this is.....
// exit condition, when n equals 0 the function doesn't self-calls
    //if(n==0){ 
    //    JOptionPane.ShowMessageDialog(null, campione);
    //    return:
    //}

    // for every element of the population the function adds this element
    // at the previous combination
    for(int x = firstElementConsidered; x &lt; population.length; x++) {
        float[] aggiunta = Arrays.copyOf(sample, sample.length + 1);
        aggiunta[aggiunta.length - 1] = population[x];
        distribuzioneInBlocco(n-1, x+1, population, aggiunta);
    }
}


So, using an array of primitive will make a big difference for your performance.

I note that you are not keeping any of these samples. If you do not need to actually keep the agguinta array, it is possible that you can save a lot of time by moving the initialization to be outside the loop:

private static void distribuzioneInBlocco(int n, int firstElementConsidered, float[] population, float[] sample){
    // not sure what this is.....
// exit condition, when n equals 0 the function doesn't self-calls
    //if(n==0){ 
    //    JOptionPane.ShowMessageDialog(null, campione);
    //    return:
    //}

    // for every element of the population the function adds this element
    // at the previous combination
    // move the array initialization outside the loop, and reuse it for each
    // recursion at this depth.
    float[] aggiunta = Arrays.copyOf(sample, sample.length + 1);
    for(int x = firstElementConsidered; x &lt; population.length; x++) {
        aggiunta[aggiunta.length - 1] = population[x];
        distribuzioneInBlocco(n-1, x+1, population, aggiunta);
    }
}