2012-06-13 31 views
8

Estoy seguro de que este problema tiene un nombre formal, y conocer ese nombre probablemente me ayude a encontrar la solución, pero no lo sé, y el problema para Google sigue señalando al Knapsack Problem, que no es lo mismo.Todas las combinaciones posibles de X se dividen en N stacks

Quiero tomar algún valor X y encontrar todas las combinaciones posibles de dividir ese valor en N pilas de enteros enteros.

En caso de que mi redacción es confusa, aquí es un ejemplo de X = 4, N = 3

Stack -> 1 | 2 | 3 | 
---------------------- 
#1-----> 4 | 0 | 0 | 
---------------------- 
#2-----> 3 | 1 | 0 | 
---------------------- 
#3-----> 2 | 1 | 1 | 
---------------------- 
#4-----> 2 | 2 | 0 | 

duplicación es aceptable, ya que es fácil de eliminar, pero lo ideal es que no sería calculado. Un algoritmo para resolver el problema sería perfecto, pero incluso descubrir que el problema tiene un nombre facilitaría la investigación. Gracias.

+1

lo tanto, desea 'N' números que se suman a una exactamente una suma de' x'? ¿No quiere que se incluyan combinaciones/permutaciones de menos de 'n' partes? Es cero una parte válida. ¿Importa el orden de las partes? ¿Las mismas partes en un orden diferente serían un duplicado? – Jodrell

+0

¿Desea solo el número de combinaciones, o desea imprimir todas las combinaciones? –

+2

Creo que esto puede ser similar a lo que está buscando. http://stackoverflow.com/questions/2593781/print-all-ways-to-sum-n-integers-so-that-they-total-a-given-sum – corn3lius

Respuesta

1

Esta es la respuesta de user434507 en C#:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var v = Partitions(5, 3, 5); 

     for (int i = 0; i < v.Count; i++) 
     { 
      for (int x = 0; x < v[i].Count; x++) 
       Console.Write(v[i][x] + " "); 
      Console.WriteLine(); 
     } 
    } 

    static private List<List<int>> Partitions(int total, int stacks, int max) 
    { 
     List<List<int>> partitions = new List<List<int>>(); 

     if (total <= 1 || stacks == 1) 
     { 
      if (total <= max) 
      { 
       partitions.Add(new List<int>()); 
       partitions[0].Add(total); 
      } 

      return partitions; 
     } 
     for (int y = Math.Min(total, max); y >= 1; y--) 
     { 
      var w = Partitions(total - y, stacks - 1, y); 
      for (int i = 0; i < w.Count; i++) 
      { 
       w[i].Add(y); 
       partitions.Add(w[i]); 
      } 
     } 

     return partitions; 
    } 
} 
+0

por favor vea mi respuesta. – Tyrsius

+0

Actualizado con nombres de variable significativos –

2

Esto parece hacer el truco:

vector<vector<int> > partitions(int X, int N, int Y) 
{ 
    vector<vector<int> > v; 
    if(X<=1 || N==1) 
    { 
     if(X<=Y) 
     { 
      v.resize(1); 
      v[0].push_back(X); 
     } 
     return v; 
    } 
    for(int y=min(X, Y); y>=1; y--) 
    { 
     vector<vector<int> > w = partitions(X-y, N-1, y); 
     for(int i=0; i<w.size(); i++) 
     { 
      w[i].push_back(y); 
      v.push_back(w[i]); 
     } 
    } 
    return v; 


    } 

int main() 
{ 
    vector<vector<int> > v = partitions(5, 3, 5); 
    int i; 
    for(i=0; i<v.size(); i++) 
    { 
     int x; 
     for(x=0; x<v[i].size(); x++) 
      printf("%d ", v[i][x]); 
     printf("\n"); 
    } 
    return 0; 
} 
+0

Estoy seguro de que esto es genial, pero no sé en qué idioma está, y no puedo entender todo . ¿Es un 'Vector' un tipo de matriz? ¿Qué hace 'push_back'? – Tyrsius

+0

Es C++ ... ¿En qué idioma quieres que responda? – user434507

+0

Es C++ y el vector es la implementación de STL de una matriz dinámica. –

5

Estos son, de hecho, como un integer partitions observaciones respuesta eliminados. Usando Mathematica:

IntegerPartitions[4, 3] // PadRight //Grid 

Salida:

4 0 0 
3 1 0 
2 2 0 
2 1 1 

no pude encontrar una aplicación C#, pero aquí hay un par de preguntas relacionadas:

Elegant Python code for Integer Partitioning

Integer Partition in Java

Algorithm for generating integer partitions


Google golpea:

Integer Partition Algorithm by Jerome Kelleher

Integer Partition Algorithm by Daniel Scocco

Fast Algorithms for Generating Integer Partitions (PDF) (se ve pesado)

Stony Brook Algorithm Repository - Partitions

+0

@MrWizard Gracias por el nombre, eso ayudará. Estoy interesado en saber cómo se genera esto. Los enlaces no parecen tener ningún código en ellos que muestre el algoritmo que se está utilizando. – Tyrsius

+0

@MrWizard, publicado un segundo demasiado pronto, gracias por los enlaces de código! – Tyrsius

+1

@Tyrsius Estoy agregando más a medida que los encuentro, sigue mirando. –

Cuestiones relacionadas