我知道有很多方法可以生成子集的方法,这些子集可以生成给定数量的总和,但是没有一个可以满足我的需求。至少不在C#中。
我需要给定数组中所有数字的组合,这些数字的总和等于给定数字。
例如,在数组a = {0,1,2,3,4,5,6,7,8,9)中,得到数字N = 56 在所有选项中,它还应返回列表“ 8,8,8,8,8,8,8,8”。 我发现大多数算法都不允许在结果中重复,而那些重复的算法不在C#中。
这是一个非常完整的线程,但不包括零。 Finding all possible combinations of numbers to reach a given sum 这是该解决方案的C#版本,如上所述。
public static void Main(string[] args)
{
List<int> numbers = new List<int>() { 3, 9, 8, 4, 5, 7, 10 };
int target = 15;
sum_up(numbers, target);
}
private static void sum_up(List<int> numbers, int target)
{
sum_up_recursive(numbers, target, new List<int>());
}
private static void sum_up_recursive(List<int> numbers, int target,
List<int> partial)
{
int s = 0;
foreach (int x in partial) s += x;
if (s == target)
Console.WriteLine("sum(" + string.Join(",", partial.ToArray()) + ")=" + target);
if (s >= target)
return;
for (int i = 0; i < numbers.Count; i++)
{
List<int> remaining = new List<int>();
int n = numbers[i];
for (int j = i + 1; j < numbers.Count; j++) remaining.Add(numbers[j]);
List<int> partial_rec = new List<int>(partial);
partial_rec.Add(n);
sum_up_recursive(remaining, target, partial_rec);
}
}
有人知道要实现它需要做什么吗?在上面的示例中,可以进行哪些更改以允许重复?
答案 0 :(得分:0)
那很容易。您需要做的就是在最后一个for()中将i + 1更改为i。最终代码为:
public static void Main(string[] args)
{
List<int> numbers = new List<int>() {0, 3, 4, 5, 6, 7, 8, 9 };
int target = 2;
sum_up(numbers, target);
Console.ReadLine();
}
private static void sum_up(List<int> numbers, int target)
{
if (numbers.Min() > target || target < 1)
{
Console.WriteLine("There is no solution!");
return;
}
if (numbers.Contains(0))
{
Console.WriteLine("There are infinite number of solutions!");
return;
}
sum_up_recursive(numbers, target, new List<int>());
}
private static void sum_up_recursive(List<int> numbers, int target,
List<int> partial)
{
int s = 0;
foreach (int x in partial) s += x;
if (s == target)
Console.WriteLine("sum(" + string.Join(",", partial.ToArray()) + ")=" + target);
if (s >= target)
return;
for (int i = 0; i < numbers.Count; i++)
{
List<int> remaining = new List<int>();
int n = numbers[i];
for (int j = i; j < numbers.Count; j++) remaining.Add(numbers[j]);
List<int> partial_rec = new List<int>(partial);
partial_rec.Add(n);
sum_up_recursive(remaining, target, partial_rec);
}
}
我还添加了零和目标值的检查