2

我有点问题。我正在将数字添加到ArrayList156、340(当它是TransferInBuy)等,然后我删除它们像 156、340(当它是TransferOutSell)一样。以下解决方案可以毫无问题地解决这个问题。我遇到的问题是,对于一些旧数据,员工输入的总和是 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;
    }
}
4

2 回答 2

4

这可能比您想象的要棘手:

于 2010-03-19T10:19:53.177 回答
3

这是背包问题的变体,称为子集和问题在此处查看我的答案以获取多种解决方案。如果您使用动态编程方法,要获得需要删除的实际项目,只需保留第二个数组,告诉您添加的最后一个元素是什么以获得一定的总和,然后您可以使用它来找到解决方案。如果您无法使其正常工作,请回帖。如果你有很多数字,无论如何我建议使用随机算法,它既更容易实现,也更节省内存和时间(通常)。

于 2010-03-19T10:31:41.140 回答