El Problema
Necesito un algoritmo que hace esto:
Encontrar todas las maneras únicas de partición de una determinada suma de los cubos de los' sin importarle el fin de
Espero haber sido claro razonablemente coherente en la expresión de mí mismo. Yo no he puesto en el código, ya que el algoritmo no está desarrollado aún por Hacer.
Ejemplo
Por la suma de 5 y 3 cubos, lo que el algoritmo debe de retorno es:
[5, 0, 0]
[4, 1, 0]
[3, 2, 0]
[3, 1, 1] [2, 2, 1]
Descargo de responsabilidad
Lo siento si esta pregunta podría ser una víctima, pero no sé exactamente lo que este tipo de problemas son llamados. Aún así, he buscado en Google y Matemáticas.SE usar todas las palabras que yo podía pensar, pero solo encontraron resultados para la distribución en la mayoría incluso forma, no todas las formas únicas.
Solución
OK, así que he jugado un poco y se le ocurrió una solución. Ya no me quieren robar el impresionante chicos de aquí que eran más rápidos que yo, de su representante, no estoy aceptando mi propia respuesta, pero ponerlo aquí. Es en Python, que es prácticamente como en pseudocódigo con un compilador.
Mi primer intento funcionado, pero estaba terriblemente ineficiente:
def intPart(buckets, balls):
return uniqify(_intPart(buckets, balls))
def _intPart(buckets, balls):
solutions = []
# base case
if buckets == 1:
return [[balls]]
# recursive strategy
for i in range(balls + 1):
for sol in _intPart(buckets - 1, balls - i):
cur = [i]
cur.extend(sol)
solutions.append(cur)
return solutions
def uniqify(seq):
seen = set()
sort = [list(reversed(sorted(elem))) for elem in seq]
return [elem for elem in sort if str(elem) not in seen and not seen.add(str(elem))]
Aquí está mi reelaborado solución. Se evita completamente la necesidad de "uniquify' por el seguimiento de las bolas en el anterior el cubo utilizando la max_
variable. Este tipo de listas y se impide que los incautos.
def intPart(buckets, balls, max_ = None):
# init vars
sols = []
if max_ is None:
max_ = balls
min_ = max(0, balls - max_)
# assert stuff
assert buckets >= 1
assert balls >= 0
# base cases
if (buckets == 1):
if balls <= max_:
sols.append([balls])
elif balls == 0:
sol = [0] * buckets
sols.append(sol)
# recursive strategy
else:
for there in range(min_, balls + 1):
here = balls - there
ways = intPart(buckets - 1, there, here)
for way in ways:
sol = [here]
sol.extend(way)
sols.append(sol)
return sols