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