Combinaciones de números con peso

Tengo una matriz/lista de números. Cada número tiene una cierta prioridad/importancia.

Necesito un algoritmo que genere todas las combinaciones de números, pero comience a formar los números con mayor importancia.

e.g. [number, priority]: [1,1], [2,3], [3,2]. Highest priority is 1.

Combinaciones:

1, 3, 2, 1 1, 1 3, 3 3, 3 1, 1 2, 3 2, 2 1, 2 2, 1 1 1, 1 1 3, 1 3 1...

¿Alguna idea de cómo hacer esto? Por supuesto, quiero generar un cierto número de combinaciones.

preguntado el 03 de mayo de 12 a las 12:05

¿Tiene código que produce permutaciones simples? Si es así, ¿qué modificaciones probaste? Si no, haz eso y luego actualiza la pregunta. -

No tengo el código porque traté de crear un algoritmo completo de pseudocódigo:

¿Qué quieres? Esto no está del todo claro. supongo 1, 3, 2 son sus números originales, ordenados wrt. ¿prioridad? Pero entonces que es 1 3? ¿De verdad te refieres a combinaciones, no a permutaciones? -

Publicación mejorada. Me refiero a todas las combinaciones con repetición. Mi error -

¿Cuántas repeticiones? ¿Es (1,1,1,1) un resultado válido? ¿Cómo está ordenado, en comparación con (1,1,1)? -

2 Respuestas

Cambié mi respuesta a un código de ejemplo, de esta manera ni siquiera necesitas una recursividad. Tienes que ordenar primero los elementos por la prioridad. El ejemplo está en Perl, que no está tan lejos de Pseudocode

@numbers = (1, 3, 2, 4);

push(@result, @numbers);
push(@working_list, @numbers);
for ($i = 1; $i < @numbers; $i++) {  # We loop exactly for the length of the array (-1 because the first iteration is already inside)
    my @result_list;
    for $result (@working_list) { # get the result of the last iteration of $i
        for $number (@numbers) { # iterate the numbers
            push (@result_list, "$result $number");  # adding the numbers
        }
    }

    push(@result, @result_list); # push the last result to final result list
    undef @working_list;
    push(@working_list, @result_list); # use the last result as a start point for next $i iteration

}

print join(', ', @result);

contestado el 03 de mayo de 12 a las 15:05

Parece que está buscando todas las combinaciones, no todas las permutaciones (no veo ningún conjunto de números repetido, por lo que solo le importa el conjunto de números, pero no el orden dentro de ese conjunto).

Aquí hay un consejo para ti: primero escribe el código que producirá todas las combinaciones posibles de los números del 1 al n y luego haz una biyección simple entre esos números y los que te dan teniendo en cuenta los pesos.

contestado el 03 de mayo de 12 a las 12:05

Su ejemplo contiene (1 3) y (3 1), por lo que claramente hace una distinción en la secuencia de los números. Podría intentar argumentar que el primer número es n y el segundo la prioridad, pero entonces no tendría (1 1) y (1 3). En mi humilde opinión, la pregunta está subespecificada y no se puede responder en el estado actual. - usuario desconocido

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.