Подсчет проблемы C # - PullRequest
       12

Подсчет проблемы C #

2 голосов
/ 19 марта 2010

У меня небольшая проблема. Я добавляю числа к ArrayList как 156, 340 (когда это TransferIn или Buy) и т. Д., А затем я удаляю их, делая это как 156, 340 (когда это TransferOut, Sell) Следующее решение работает для этого без проблем. У меня проблема в том, что для некоторых старых данных сотрудники вводили сумму как 1500 вместо 500 + 400 + 100 + 500. Как бы я изменил его так, чтобы при наличии Sell / TransferOut и отсутствии совпадения внутри ArrayList он пытался добавить несколько элементов из этого ArrayList и найти элементы, которые объединяются в совокупность.

   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;
    }
}

Ответы [ 2 ]

4 голосов
/ 19 марта 2010

Это может оказаться сложнее, чем вы думаете:

3 голосов
/ 19 марта 2010

Это разновидность задачи о ранце, называемая проблемой подмножества сумм . Проверьте мой ответ здесь для нескольких решений. Чтобы получить фактические элементы, которые нужно удалить, если вы используете подход динамического программирования, просто сохраните второй массив, который сообщает вам, какой элемент был добавлен последним, чтобы получить определенную сумму, а затем вы можете использовать это для поиска решения. Отправьте обратно, если вы не можете заставить его работать. Если у вас много чисел, я все равно предлагаю рандомизированный алгоритм, его проще реализовать, а также больше памяти и экономить время (обычно).

...