2010-11-20 37 views
1

Dites qu'il y a x nombre de boîtes, chaque boîte contient un "inventaire" des lettres A-Z, chaque inventaire de lettres étant 1 ou plus.Comment implémenter un tel algorithme?

Maintenant, dis-je besoin:

  • 6 Comme
  • 2 hôtes
  • 1 C

Comment puis-je obtenir une liste de toutes les combinaisons possibles/permutation des boîtes cela peut me fournir les lettres dont j'ai besoin?

L'algorithme doit également produire une combinaison de boîtes pour répondre à mes besoins. Par exemple: disons que Box-1 n'a que 4 As et que Box-2 a 1 A et que Box-3 a 1 A, j'ai besoin du résultat de l'algorithme pour spécifier que le 6 As peut être rempli sur les 3 cases.

Quelle est la logique de base à la solution d'un tel problème. Y a-t-il des algorithmes particuliers que je dois examiner pour cela?

EDIT 1:

par la suggestion de dcp, voici ma tentative que la mise en œuvre de PHP:

$boxes = array(
    // box 1 
    array(
     'A' => 6, 
     'B' => 4, 
     'C' => 10 
    ), 
    // box 2 
    array(
     'A' => 8, 
     'B' => 4, 
     'C' => 2 
    ), 
    // box 3 
    array(
     'A' => 1, 
     'B' => 1, 
     'C' => 0 
    ) 
); 

$n = count($boxes); 

for ($mask = 0; $mask <= (1 << $n) - 1; $mask++) 
{ 
    $tots = array(); 
    for ($i = 0; $i < $n; $i++) 
    { 
     if (((1 << $i) & $mask) != 0) 
     { 
      // this is a selected box for this mask, add the A's, B's etc. for this box to the total 
      $tots[0] += $boxes[$i]['A']; 
      $tots[1] += $boxes[$i]['B']; 
      $tots[2] += $boxes[$i]['C']; 
     } 
     // check the tots array to see if it meets the letter requirements. If it does, 
     // then this is a valid combination of boxes. 
    } 
} 
+0

Pourriez-vous fournir un certain arrière-plan? Pourquoi voulez-vous TOUTES les combinaisons? Cela ne semble pas utile, car après avoir listé les cas, vous n'avez pas de critère pour en sélectionner un. À moins que ce soit de la curiosité ... ou des devoirs. –

+0

@belisarius: il ne doit pas y avoir de critère pour en sélectionner un. Peut-être que le problème est résolu avec toutes les combinaisons identifiées. Aussi, pourquoi les deux seules raisons possibles pour lesquelles je pose cette question sont "curiosité" ou "devoirs"? Cela ne pourrait-il pas être un problème réel sur lequel je travaille? – StackOverflowNewbie

+0

Oh oui !, bien sûr! Comme il s'agit d'un site «donnant-donnant», je vous demande simplement de partager la partie la plus publique de la raison d'être de votre question, juste pour aider les autres à reconnaître le genre de problème que les réponses que vous obtenez pourraient être appliquées. Les réponses valides sont {mon problème est ...}, {curiosité}, {pas votre entreprise}. Le dernier n'aide pas beaucoup, cependant. –

Répondre

1

Si le nombre de boîtes est assez petite, disons 25 ou moins, vous pourriez utiliser un masque de bits pour la force brute sur toutes les combinaisons de boîtes possibles:

// assume n is number of boxes, and boxes is the array of boxes 
for(int mask = 0; mask <= (1<<n)-1; ++mask) { 
    int tots[26]; 
    for(int i = 0; i < n; ++i) { 
    if (((1<<i)&mask) != 0) { 
     // this is a selected box for this mask, add the A's, B's etc. for this box to the total 
     tots[0] += number of A's in box i 
     tots[1] += number of B's in box i 
     . 
     . 
    } 
    // check the tots array to see if it meets the letter requirements. If it does, 
    // then this is a valid combination of boxes. 
    } 
} 
+0

@dcp: est-ce qu'il y a une "boîte" variable dans votre extrait? De plus, je ne connais pas la notation << <<; Qu'est-ce que ça veut dire? – StackOverflowNewbie

+0

Oui, les boîtes sont un tableau des boîtes, et chaque élément de tableau doit contenir le nombre de a, b, etc. pour la boîte donnée. La notation << est décalée à gauche de 1 bit. (1 << n) -1 représente toutes les cases sélectionnées (donc si vous avez 10 cases, ce nombre sera (2^n) -1 Vous pouvez penser que 1 << n et 2^n sont identiques, parce qu'ils sont :). – dcp

+0

Cela me semble une très bonne solution avec seulement un petit problème possible. S'il y a une contrainte que vous devez prendre au moins une lettre en visitant une boîte, cet algorithme générera des permutations qui violent ceci. Par exemple. Si vous avez juste besoin d'une lettre de x = 10 cases, cela peut être exactement satisfait en visitant l'une des 10 cases car elles contiennent toutes au moins une instance de chaque type de lettre ... mais elle sera "insatisfaite" en visitant toutes les 10 cases (masque = 1111111111), ce qui signifie que vous ne récupérez aucune lettre dans certaines cases. –