2010-03-19 4 views
2

J'ai un peu de problème. J'ajoute des nombres à ArrayList comme 156, 340 (quand c'est TransferIn ou Buy) etc. et puis je les enlève le faire comme 156, 340 (quand c'est TransferOut, Sell). La solution suivante fonctionne pour cela sans problème. Le problème que j'ai, c'est que pour certaines anciennes données, les employés saisissaient la somme comme 1500 au lieu de 500 + 400 + 100 + 500. Comment est-ce que je le changerais de sorte que quand il y a Sell/TransferOut et qu'il n'y ait aucune correspondance dans ArrayList il devrait essayer d'ajouter plusieurs éléments de cette ArrayList et trouver des éléments qui se combinent dans l'ensemble.Problème de comptage C#

ArrayList alNew = new ArrayList(); 
    ArrayList alNewPoIle = new ArrayList(); 
    ArrayList alNewCo = new ArrayList(); 
    string tempAkcjeCzynnosc = (string) alInstrumentCzynnoscBezNumerow[i]; 
    string tempAkcjeInId = (string) alInstrumentNazwaBezNumerow[i]; 
    decimal varAkcjeCena = (decimal) alInstrumentCenaBezNumerow[i]; 
    decimal varAkcjeIlosc = (decimal) alInstrumentIloscBezNumerow[i]; 
    int index; 
    switch (tempAkcjeCzynnosc) {     

      case "Sell": 
      case "TransferOut": 
      index = alNew.IndexOf(varAkcjeIlosc); 
      if (index != -1) { 
       alNew.RemoveAt(index); 
       alNewPoIle.RemoveAt(index); 
       alNewCo.RemoveAt(index); 
      } else { 
       // Number without match encountred 
      } 
      break; 

      case "Buy": 
      case "TransferIn": 
       alNew.Add(varAkcjeIlosc); 
       alNewPoIle.Add(varAkcjeCena); 
       alNewCo.Add(tempAkcjeInId); 
       break; 
    } 
} 
+0

Lorsque vous cliquez sur ce cas particulier, triez le tableau et commencez à additionner les éléments jusqu'à ce que vous atteigniez/transmettez la valeur (1500 dans votre exemple). Si vous le frappez alors vous avez une combinaison que vous pouvez transférer, sinon .. il n'y a pas une telle combinaison, aller de l'avant ... :) – tzup

+2

@tzup - pas vrai. Considérons les éléments «1 12 100» et la valeur «101». Vous devez sommer «1 + 12 = 13» puis «100 + 13 = 113» et dire qu'il n'y a pas de solution, alors qu'en fait il y en a. – IVlad

+0

vous avez raison, je suppose que je tapais beaucoup plus vite que je pensais. – tzup

Répondre

3

Ceci est une variante du problème de l'subset sum problem appelé havresac. Vérifiez ma réponse here pour plusieurs solutions. Pour obtenir les éléments réels que vous devez supprimer si vous utilisez l'approche de programmation dynamique, gardez juste un deuxième tableau qui vous indique quel était le dernier élément que vous avez ajouté pour obtenir une certaine somme, alors vous pouvez l'utiliser pour trouver la solution. Poster un message si vous ne pouvez pas le faire fonctionner. Si vous avez beaucoup de nombres, je suggère l'algorithme randomisé de toute façon, il est à la fois plus facile à implémenter et plus de mémoire et de temps (en général).

+0

Merci, va essayer de travailler avec elle. Je viens d'avoir une conversation avec le directeur du département et il a dit qu'ils allaient effectuer ces transactions avant qu'elle ne soit lancée, donc j'espère qu'il n'y a pas besoin de mettre en œuvre cette solution de contournement. – MadBoy

+0

IVlad si vous êtes encore si gentil et pouvez m'aider avec le problème de somme sous-ensemble s'il vous plaît faire. J'ai ouvert une nouvelle question: http://stackoverflow.com/questions/2708436/subset-sum-problem – MadBoy

4

Cela pourrait se révéler plus délicat que vous pourriez penser:

+0

Eh bien, je dois résoudre ce problème en tant que tel ajouté dans la base de données. Je pourrais le faire SUM et faire CAS QUAND il y en a mais problème il ne me dit pas quels paquets sont expulsés et qui sont toujours dedans. Nous nettoierons ce gâchis quand la base de données sera mise en ligne mais jusque là je dois avoir la solution de travail que les "résultats" sont ceux auxquels je m'attends aussi. Plus tard, je vais supprimer 1500 et insérer 5 paquets Sell/TransferOut pour résoudre ce problème. Mais ce sera un travail manuel, ça va prendre un moment. – MadBoy

+0

La liste peut varier. parfois 30 articles, parfois moins. parfois plus. Selon combien de temps nous l'avons comme client. – MadBoy

+0

N'a pas vu plus de 100. – MadBoy