public ArrayList<GrupoElementos> getSubgrupos() {

        ArrayList<GrupoElementos> subgrupos = new ArrayList<>();
        int l = elementos.size();
        boolean num[] = new boolean[l]; //El número que indica qué elementos pertenecen al conjunto

        //permutar opciones, contar en binario
        int c = 0; //Posición a cambiar
        boolean fin = false;
        while (c < l) {
            c = 0;//Inicializamos el contador de posición
            while (!fin && num[c]) {//Si la posición es un uno entonces ponemos un cero y nos movemos a la siguiente
                num[c] = false;
                c++;

                //Si nos hemos pasado hemos acabado
                if (c >= l) {
                    fin = true;
                }

            }

            if (!fin) {//Si aún no hemos terminado...
                //Cuando hayamos llegado a una posición en false la volvemos true
                num[c] = true;

                //Con el número que compone el vector formamos el subgrupo
                GrupoElementos nuevo = new GrupoElementos();
                for (int i = 0; i < l; i++) {//Recorremos el número bit a bit, en los que haya true se copian al subgrupo
                    if (num[i]) { //Si la posición i está a true ese elemento es del subgrupo
                        nuevo.getElementos().add(elementos.get(i));
                    }
                }
                //El soporte del grupo se hereda
                nuevo.setSoporte(this.getSoporte());
                //Añadimos el nuevo grupo a la lista a devolver
                subgrupos.add(nuevo);

            }
        }

        //Almacenamos el puntero al resultado por si se vuelve a pedir inmediatamente
        _subgrupos = subgrupos;
        
        return subgrupos;
    }