【问题标题】:Counting problem C#计数问题 C#
【发布时间】:2011-01-29 09:40:48
【问题描述】:

我有点问题。我正在向ArrayList 添加数字,例如 156、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;
    }
}

【问题讨论】:

  • 当您遇到这种特殊情况时......对数组进行排序并开始对元素求和,直到您点击/传递值(在您的示例中为 1500)。如果你击中它,那么你有一个可以转移出去的组合,如果没有......没有这样的组合,继续...... :)
  • @tzup - 不正确。考虑元素1 12 100 和值101。你会总结 1 + 12 = 13 然后 100 + 13 = 113 并说没有解决方案,而实际上有。
  • 你说得对,我想我打字的速度比我想象的要快。

标签: c# counting


【解决方案1】:

【讨论】:

  • 好吧,我必须以某种方式解决这个问题,因为这会在数据库中添加。我可以在里面做 SUM 并做 CASE WHEN 但问题它没有告诉我哪些数据包被踢出,哪些仍然在里面。当数据库上线时我们将清理这个烂摊子,但在那之前我必须有工作解决方案所以“结果”也是我所期望的。稍后我将删除 1500 并插入 5 个 Sell/TransferOut 数据包来解决此问题。但这将是手工工作,所以需要一段时间。
  • 列表会有所不同。有时 30 件,有时更少。有时更多。取决于我们让他成为客户的时间。
  • 嗯,我希望这将是临时解决方案,因为我将推动员工实际删除总和并将适当的值放入其中,但在他们这样做之前,我必须正确计数。
  • DP 对于几百个元素的工作速度非常快。假设数字并不大(一万应该没问题)。
  • 查看 IVlad 的答案以及该答案中的链接。在这种情况下,这可能是您最好的选择。
【解决方案2】:

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

【讨论】:

  • 谢谢,会尝试使用它。刚刚与部门主管进行了交谈,他说他们会在这些交易上线之前完成这些交易,因此希望不需要实施此解决方法。
  • IVlad 如果你仍然那么好心并且可以帮助我解决子集和问题,请这样做。我打开了新问题:stackoverflow.com/questions/2708436/subset-sum-problem
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多