gpt4 book ai didi

c# - 在一组数字中找到一个组合的有效算法,该组合的总和等于一个已知数字

转载 作者:太空狗 更新时间:2023-10-29 17:32:09 25 4
gpt4 key购买 nike

假设有一组数字

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);

最佳答案

你可以使用递归。对于集合中的任何给定数字,找到加起来等于该数字的较小数字的组合:

public static IEnumerable<string> GetCombinations(int[] set, int sum, string values) {
for (int i = 0; i < set.Length; i++) {
int left = sum - set[i];
string vals = set[i] + "," + values;
if (left == 0) {
yield return vals;
} else {
int[] possible = set.Take(i).Where(n => n <= sum).ToArray();
if (possible.Length > 0) {
foreach (string s in GetCombinations(possible, left, vals)) {
yield return s;
}
}
}
}
}

用法:

int[] set = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

foreach (string s in GetCombinations(set, 18, "")) {
Console.WriteLine(s);
}

输出:

1,2,4,5,6,
3,4,5,6,
1,2,3,5,7,
2,4,5,7,
2,3,6,7,
1,4,6,7,
5,6,7,
1,2,3,4,8,
2,3,5,8,
1,4,5,8,
1,3,6,8,
4,6,8,
1,2,7,8,
3,7,8,
2,3,4,9,
1,3,5,9,
4,5,9,
1,2,6,9,
3,6,9,
2,7,9,
1,8,9,
1,3,4,10,
1,2,5,10,
3,5,10,
2,6,10,
1,7,10,
8,10,

关于c# - 在一组数字中找到一个组合的有效算法,该组合的总和等于一个已知数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10738926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com