2017-01-15 1 views
-5

Je cherche un algorithme récursif pour partitionner un nombre en k parties.Algorithme de partition Java

Pour exemple:

P(5,2) > { {1,4},{2,3} } 
P(7,2) > { {1,6},{2,5},{3,4} } 
P(5,3) > { {1,1,3},{1,2,2} } 

En Java, mais il peut être un autre langage.

Mon code actuellement

public static void partition(int n, int k) { 
     partition(n, k, " "); 
    } 

    public static void partition(int n, int max, String prefix) { 
     if (n == 0) { 
      System.out.println(prefix); 
      return; 
     } 

     for (int i = Math.min(max, n); i >= 1; i--) { 
      partition(n-i, i, prefix + " " + i); 
     } 
    } 
+1

et vous avez déjà essayé quoi? – nullpointer

+0

Étape 1) prendre les facteurs premiers. Étape 2) appliquer le théorème binomial. Voir aussi [cette réponse] (http://stackoverflow.com/a/6999554/2071828). –

+0

J'ai un algorithme de base comme celui-ci: partition publique vide statique (int n, int k) { partition (n, k, ""); } partition publique statique vide (int n, int max, préfixe de chaîne) { if (n == 0) { System.out.println (préfixe); retour; Pour (int i = Math.min (max, n); i> = 1; i--) { partition (n-i, i, préfixe + "" + i); } } – Shining

Répondre

0

Si je comprends bien, vous voulez partitionner n exactement k nombres, chacun au moins un (1).

Je voudrais d'abord vérifier que n >= k et k >= 1 car sinon ce n'est pas possible (laisser le cas d'angle n = k = 0).

Dans votre appel récursif, puisque vous apposent exactement un numéro à prefix, je pense que vous devriez passer max - 1 comme second argument pour vous assurer que vous finirez avec exactement k partitions.

Il peut y avoir d'autres problèmes. Si vous nous dites votre sortie actuelle, il peut être plus facile à voir.