Générer les partitions d'un certain nombre

J'ai besoin d'un algorithme permettant de générer toutes les partitions possibles d'un nombre positif, et je suis venu avec un (affichée comme réponse), mais il est temps exponentiel.

L'algorithme doit retourner tous les moyens possibles un certain nombre peut être exprimé comme la somme de nombres positifs est inférieur ou égal à lui-même. Donc par exemple pour le nombre 5, le résultat serait:

  • 5
  • 4+1
  • 3+2
  • 3+1+1
  • 2+2+1
  • 2+1+1+1
  • 1+1+1+1+1

Donc ma question est: est-il un algorithme plus efficace pour cela?

EDIT: Question a été intitulé "la Somme de décomposition d'un nombre", car je ne savais pas vraiment ce que cela a été appelé. ShreevatsaR souligné qu'ils étaient appelés des "partitions", donc j'ai édité la question du titre en conséquence.

  • Juste par curiosité: est-ce une question théorique (qui est OK) ou c'est une mise en pratique?
  • Il a une utilisation pratique pour moi. J'ai besoin de générer toutes les partitions d'un nombre N. Chaque partition correspond à une distribution différente, et donc un autre "couverture" de la valeur, que je suis en train de l'optimiser.
  • Si vous êtes à la recherche pour simplement le nombre de partitions et de ne pas la formule, il y a une forme fermée solution.
  • Qu'est-ce que cette solution de la forme finie?
  • Je n'ai pas envie d'ajouter une nouvelle réponse ou de la modification de la mine, mais note que Knuth traite des algorithmes de génération de toutes les partitions dans la Section 7.2.1.4 (Volume 4A de L'Art de la Programmation Informatique). Une première ébauche de cet article est disponible en ligne. (PDF, PS)
  • Intéressant de noter qu'il y a une connexion à la 'pièce de monnaie problème du changement" ou "pièces de monnaies de problème", qui a Dynamique des solutions de Programmation, si vous êtes seulement en considérant les partitions plus restreint des ensembles d'entiers (pièces particulières).