假设有一组数字:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
我想找到这个数字集合中几个数字的组合,使得它们的总和等于一个已知的数字,例如18。我们可以找到匹配的数字5、6、7 (5+6+7=18)。
组合中的数字不能重复,并且集合中的数字可能不是连续的。
我写了一个 C# 程序来实现这个目标。程序随机选择数字来组成组合,并检查组合的总和是否等于已知数字。然而,程序找到的组合可能会重复,这使得进程变得不够有效。
我想知道是否有任何有效的算法来找到这样的组合。
以下是我的代码的一部分:
int Sum = 0;
int c;
List<int> Pick = new List<int>();
List<int> Target = new List<int>() {some numbers}
Target.Sort();
while (!Target.Contains(Sum))
{
if (Sum > Target[Target.Count - 1])
{
Pick.Clear();
Sum = 0;
}
while (true)
{
if (Pick.IndexOf(c = Math0.rand(0, Set.Count - 1)) == -1)
{
Pick.Add(c);
}
//Summation Pick
Sum = 0;
for (int i = 0; i < Pick.Count; i++)
Sum += Set[Pick[i]];
if (Sum >= Target[Target.Count - 1])
break;
}
}
Result.Add(Pick);