Return 只有给定数字列表的一个子集总和为目标值
Return only one subset of a given number list that sums to a target value
我希望有人可以帮助解决我遇到的子集求和问题。我从另一个线程中获取了以下代码。理想情况下,我想做的是有一个函数 returns 第一个满足此条件的数组:“ if (s == target && partial.ToArray().Length == 7) ”。
我在下面使用的代码可能吗?换句话说,我不想要所有的组合,只想要第一个满足该条件的组合。我已经尝试了一些东西,但我在 C# 方面经验不足,无法真正理解如何突破递归或 return 数组到调用函数。任何帮助将不胜感激。
private void button1_Click(object sender, EventArgs e)
{
List<int> numbers = new List<int>() { 2, 6, 6, 5, 8, 1, 3, 3, 9, 3, 6, 1, 3, 9, 1, 7, 8, 6, 8, 1, 1, 4, 4, 2, 8, 4, 5, 4, 6, 10, 1, 4, 3, 1, 2, 8, 4, 5, 9, 2, 2, 4 };
int target = 27;
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 && partial.ToArray().Length == 7)
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);
}
}
}
我相信有更简单的方法可以做到这一点,但要使用您的代码,我相信这是您可以做到的一种方法:
using System.Linq;
using System.Collections.Generic;
private void button1_Click(object sender, EventArgs e)
{
List<int> numbers = new List<int>
{
2, 6, 6, 5, 8, 1, 3, 3, 9, 3, 6, 1, 3, 9, 1, 7, 8, 6, 8, 1, 1,
4, 4, 2, 8, 4, 5, 4, 6, 10, 1, 4, 3, 1, 2, 8, 4, 5, 9, 2, 2, 4
};
int target = 27;
sum_up(numbers, target);
}
private static void sum_up(List<int> numbers, int target)
{
sum_up_recursive(numbers, target, new List<int>(), 0);
}
private static void sum_up_recursive
(List<int> numbers, int target, List<int> @partial, int index)
{
int s = @partial.Sum();
if (s >= target && @partial.Count == 7)
{
Console.WriteLine("sum(" + string.Join(",", partial.ToArray()) + ")=" + target);
}
else if (s < target)
{
if( index + 7 > numbers.Count )
{
return;
}
else
{
List<int> partial_rec = numbers.GetRange(index, index + 7);
sum_up_recursive(numbers, target, partial_rec, ++index);
}
}
}
我希望有人可以帮助解决我遇到的子集求和问题。我从另一个线程中获取了以下代码。理想情况下,我想做的是有一个函数 returns 第一个满足此条件的数组:“ if (s == target && partial.ToArray().Length == 7) ”。 我在下面使用的代码可能吗?换句话说,我不想要所有的组合,只想要第一个满足该条件的组合。我已经尝试了一些东西,但我在 C# 方面经验不足,无法真正理解如何突破递归或 return 数组到调用函数。任何帮助将不胜感激。
private void button1_Click(object sender, EventArgs e)
{
List<int> numbers = new List<int>() { 2, 6, 6, 5, 8, 1, 3, 3, 9, 3, 6, 1, 3, 9, 1, 7, 8, 6, 8, 1, 1, 4, 4, 2, 8, 4, 5, 4, 6, 10, 1, 4, 3, 1, 2, 8, 4, 5, 9, 2, 2, 4 };
int target = 27;
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 && partial.ToArray().Length == 7)
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);
}
}
}
我相信有更简单的方法可以做到这一点,但要使用您的代码,我相信这是您可以做到的一种方法:
using System.Linq;
using System.Collections.Generic;
private void button1_Click(object sender, EventArgs e)
{
List<int> numbers = new List<int>
{
2, 6, 6, 5, 8, 1, 3, 3, 9, 3, 6, 1, 3, 9, 1, 7, 8, 6, 8, 1, 1,
4, 4, 2, 8, 4, 5, 4, 6, 10, 1, 4, 3, 1, 2, 8, 4, 5, 9, 2, 2, 4
};
int target = 27;
sum_up(numbers, target);
}
private static void sum_up(List<int> numbers, int target)
{
sum_up_recursive(numbers, target, new List<int>(), 0);
}
private static void sum_up_recursive
(List<int> numbers, int target, List<int> @partial, int index)
{
int s = @partial.Sum();
if (s >= target && @partial.Count == 7)
{
Console.WriteLine("sum(" + string.Join(",", partial.ToArray()) + ")=" + target);
}
else if (s < target)
{
if( index + 7 > numbers.Count )
{
return;
}
else
{
List<int> partial_rec = numbers.GetRange(index, index + 7);
sum_up_recursive(numbers, target, partial_rec, ++index);
}
}
}