En este desafío, recibirá una lista de pesos separados por comas como entrada, como
1,3,4,7,8,11
Y debe generar la menor cantidad de pesos que pueda agregar a ese conjunto. Por ejemplo, la salida para este conjunto sería
1,3,7
Porque podrías representar todos esos pesos con solo esos tres:
1 = 1
3 = 3
1+3 = 4
7 = 7
1+7 = 8
1+3+7 = 11
Puede haber más de una solución. Por ejemplo, su solución para la entrada 1,2
podría ser 1,1
o 1,2
. Siempre que encuentre la cantidad mínima de pesos que puede representar el conjunto de entrada, es una solución válida.
Las pesas no se pueden usar más de una vez. Si necesita usar uno dos veces, debe generarlo dos veces. Por ejemplo, 2,3
no es una solución válida 2,3,5,7
porque no puede usar el 2
doble para 2+2+3=7
.
Se garantiza que la entrada no tenga números duplicados.
Esto es código-golf entonces el código más corto por conteo de caracteres gana.
El acceso a la red está prohibido (por lo que ninguna de sus wget
soluciones "inteligentes" @JohannesKuhn tose tos );)
Casos más simples:
1,5,6,9,10,14,15 => 1,5,9
7,14,15,21,22,29 => 7,14,15
4,5,6,7,9,10,11,12,13,15,16,18 => 4,5,6,7
2,3,5,7 => 2,2,3 or 2,3,7
Y algunos más complicados:
10,16,19,23,26,27,30,37,41,43,44,46,50,53,57,60,61,64,68,71,77,80,84,87
=> 3,7,16,27,34
20,30,36,50,56,63,66,73,79,86
=> 7,13,23,43
27,35,44,46,51,53,55,60,63,64,68,69,72,77,79,81,86,88,90,95,97,105,106,114,123,132
=> 9,18,26,37,42
7,7,7,8
arriba), lo que aumenta la complejidad muchas veces.n
pesos de entrada ym
es el más grande, enumere todas las subsecuencias de(1..m)
y para cada subsecuencia, enumere cada combinación de entre 1 en
instancias de cada elemento de la secuencia.)Respuestas:
Mathematica
8075Actualización: vea al final una actualización sobre la última prueba desafiante de Doorknob, agregada el 5 de noviembre
Esto pasa todo menos la última prueba. Sin embargo, no intenta usar un dígito más de una vez. Y solo busca en soluciones que son subconjuntos del conjunto de datos más grande.
La función genera todos los subconjuntos del conjunto de datos de entrada y luego prueba qué subconjuntos se pueden usar para construir el conjunto completo. Después de encontrar los subconjuntos viables, elige los conjuntos más pequeños.
Pruebas
Actualizar
A continuación, proporcionaré un análisis inicial que puede ayudar a comenzar a encontrar una solución.
Los datos:
A diferencia del enfoque anterior, queremos considerar, en el conjunto de soluciones, los números que NO aparecen en el conjunto de datos.
El enfoque hace uso de diferencias absolutas entre pares de números en el conjunto de datos.
Veamos la cantidad de veces que aparece cada diferencia; solo tomaremos los primeros 8 casos, comenzando por la diferencia más común].
14 pares diferían en 7; 13 pares diferían en 27, y así sucesivamente.
Ahora, probemos los subconjuntos que comienzan con {diferencia1}, {diferencia1, diferencia2}, y así sucesivamente, hasta que podamos tener en cuenta todos los elementos originales del conjunto de datos.
h
revela aquellos números del conjunto original que no pueden construirse componiendo sumas del subconjunto.Para el quinto intento, todavía hay 10 elementos que no se pueden formar a partir de {7, 27, 34, 3, 20}:
Pero en el próximo intento, se tienen en cuenta todos los números del conjunto de datos:
Esto todavía no es tan económico como {3,7,16,27,34}, pero está cerca.
Todavía hay algunas cosas adicionales a tener en cuenta.
Estos son más problemas de los que puedo manejar en este momento. Pero espero que arroje algo de luz sobre este desafío tan interesante.
fuente
w
se repite un peso , entonces la misma solución con uno de losw
s cambiados2 * w
también funciona, ya que puede usar2 * w
todos los lugares que usabaw + w
antes. Esto puede repetirse hasta que la solución no tenga repeticiones. Por lo tanto, no necesita intentar usar repeticiones.s=Subsets;
cabo de la funciónRubí 289
Esta es una enumeración directa, por lo que obtendrá soluciones mínimas, pero puede llevar años, posiblemente años luz, resolver algunos problemas. Todos los "casos más simples" se resuelven en unos segundos como máximo (aunque obtuve 7,8,14 y 1,2,4 para los casos 3 y 5, respectivamente). El complicado # 2 se resolvió en aproximadamente 3 horas, pero los otros dos son demasiado grandes para enumerarlos, al menos por la forma en que lo hice.
Una matriz de tamaño
n
que genera la matriz dada sumando subconjuntos de sus elementos es de tamaño mínimo si se puede demostrar que no hay una matriz de tamaño< n
que lo haga. No puedo ver otra manera de demostrar la optimización, así que comienzo la enumeración con subconjuntos de tamañom
, dondem
se conoce un límite inferior, y luego aumento el tamaño am+1
después de haber enumerado subconjuntos de tamañom
y se muestra que ninguno de esos "abarcan" el dado matriz, y así sucesivamente, hasta que encuentre un óptimo. Por supuesto, si he enumerado todos los subconjuntos hasta el tamaño n, podría usar una heurística para el tamaño n + 1, de modo que si encontrara una matriz de ese tamaño, sabría que es óptima. ¿Alguien puede sugerir una forma alternativa de demostrar que una solución es óptima en el caso general?He incluido algunas verificaciones opcionales para eliminar algunas combinaciones desde el principio. Eliminar esos cheques ahorraría 87 caracteres. Son los siguientes (
a
es la matriz dada):n
puede generar en la mayoría de2^n-1
los números positivos distintos; por lo tanto,2^n-1 >= a.size
on >= log2(a.size).ceil
(el "límite inferior" al que me referí anteriormente).b
de tamaño candidaton
puede descartarse si:b.min > a.min
sum of elements of b < a.max
ob.max < v
, dondev = a.max.to_f/n+(n-1).to_f/2.ceil
(to_f
siendo conversión a flotante).El último de estos, que se verifica primero, implementa
La nota
v
es constante para todas las matrices de generadores de tamañon
.También he utilizado la observación muy útil de @ cartón_box de que no hay necesidad de considerar duplicados en la matriz generadora.
En mi código
genera todas las combinaciones de los números del 1 al
a.max
, tomadasn
a la vez (dondea.max = a.last = a[-1]
). Para cada combinaciónb
:llena un hash
h
con todos los números que son sumas sobre subconjuntos no vacíos deb
. Las claves hash son esos números; Los valores son arbitrarios. (Elegí establecer el último en cero).comprueba si cada elemento de la matriz dada
a
es una clave en el hash (h[e] != nil
o simplementeh[e]
).Suponer
Luego iteramos sobre el rango:
La representación binaria de cada número en este rango se utiliza para apuñalar los elementos de
b
suma. Paraj = 3
(j
siendo el índice de rango),El código:
fuente