【发布时间】:2012-10-26 23:03:51
【问题描述】:
我正在开发一个应用程序,该应用程序需要根据各种标准匹配两组数据,包括每组中任意数量项目的总和。我已将问题提炼为以下陈述:
给定一组项目和交易,找到总和等于最小交易集总和的最小项目集。 (本文忽略了一些复杂性,但现在我只关心匹配的总金额,而不是日期、描述、清算差异等)
或者,在数学上:给定两组数字,从每组中找出总和相等的最小集合。
我遇到的其他类似 SO 问题假设您提前知道总和,或者知道您要购买的每组的数量。
这是一个测试,(我认为)说明了我的目标。
[TestMethod]
public void StackOverflowTest()
{
var seta = new[]{10, 20, 30, 40, 50};
var setb = new[]{ 45, 45, 100, 200 };
var result = Magic(seta, setb);
Assert.AreEqual(new[]{40,50},result.SetA);
Assert.AreEqual(new[] { 45, 45 }, result.SetB);
}
class MagicResult
{
public int[] SetA { get; set; }
public int[] SetB { get; set; }
}
private MagicResult Magic(int[] seta, int[] setb)
{
throw new NotImplementedException();
}
我正在寻找一个优雅的解决方案来通过这个,但会接受任何让我到达那里的伪代码或建议;)
【问题讨论】:
-
+1 用于包含测试方法:D
-
如果有多个集合满足此条件,您会怎么做?另外,你想要最小的集合和最小的数字吗?
-
最后一个 :) - 一组 1 个可以接受吗?
-
@Abe:“最小集合”是指项目数量最少的集合。因此,如果有多个满足条件的集合,那么它应该返回具有最少项目数的集合。如果多个匹配该条件,那么它可以只返回第一个匹配项(在实际应用中,这不太可能)。
-
A 和 B 中的一组 1 是可以接受的。一组来自 A 的 1 和来自 B 的 0 是不可接受的。因此,如果测试中的 SetA 和 SetB 都包含“42”,那么它将返回 setA 中的 42 和 setB 中的 42 的结果。