数の集合があるとしましょう
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);