C# 将数组的值求和为特定值

C# 将数组的值求和为特定值,c#,C#,我有一个整数数组,我想确定数组整数的值,使最少的值之和=某个指定的数字 E.g. int[] array = {1, 2, 4, 8}; specified number = 11; 很明显,这些值是1、2和8(1+2+8=11),但如何在C#中对其进行编码?递归解决方案- 检查从最大(最后一个位置)到最小(位置0)的所有数字。(假设数组按您编写的方式排序,尽管这并不重要。) 在每次迭代中,将带有当前位置的数字的选项A与不带该数字的选项B进行比较,并选择项目较少的选项 static void

我有一个整数数组,我想确定数组整数的值,使最少的值之和=某个指定的数字

E.g. int[] array = {1, 2, 4, 8};
specified number = 11;
很明显,这些值是1、2和8(1+2+8=11),但如何在C#中对其进行编码?

递归解决方案-

检查从最大(最后一个位置)到最小(位置0)的所有数字。(假设数组按您编写的方式排序,尽管这并不重要。)

在每次迭代中,将带有当前位置的数字的选项A与不带该数字的选项B进行比较,并选择项目较少的选项

static void Main(string[] args)
{
    int[] array = { 1, 2, 4, 8 };
    int specifiedNumber = 11;

    int[] result = FindFewestValues(ref array, array.Length - 1, 0, specifiedNumber);
    if (result == null)
        Console.WriteLine("No result");
    else
    {
        foreach (int x in result)
            Console.Write(x + ", ");
        Console.WriteLine();
    }
}

static int[] FindFewestValues(ref int[] array, int pos, int tmpSum, int requiredSum)
{
    int currentSum = tmpSum + array[pos];

    if (currentSum == requiredSum)
        return new int[] { array[pos] };

    if (pos == 0)   // Reached last element
        return null;

    if (currentSum > requiredSum)   // Too big, move to next smaller number
        return FindFewestValues(ref array, pos - 1, tmpSum, requiredSum);

    // Use current pos:
    int[] optionA = FindFewestValues(ref array, pos - 1, currentSum, requiredSum);
    // Don't use current pos:
    int[] optionB = FindFewestValues(ref array, pos - 1, tmpSum, requiredSum);

    if (optionA == null)
    {
        return optionB;
    }
    else
    {
        optionA = optionA.Append(array[pos]).ToArray();
        if (optionB == null)
            return optionA;

        if (optionA.Length < optionB.Length)
            return optionA;
        else
            return optionB;
    }
}
static void Main(字符串[]args)
{
int[]数组={1,2,4,8};
int-specifiedNumber=11;
int[]result=FindFewestValues(ref数组,array.Length-1,0,specifiedNumber);
如果(结果==null)
控制台。写入线(“无结果”);
其他的
{
foreach(结果中的int x)
控制台。写(x+“,”);
Console.WriteLine();
}
}
静态int[]findfewestvalue(参考int[]数组、int pos、int tmpSum、int requiredSum)
{
int currentSum=tmpSum+array[pos];
如果(currentSum==requiredSum)
返回新的int[]{array[pos]};
if(pos==0)//到达最后一个元素
返回null;
如果(currentSum>requiredSum)//太大,请移到下一个较小的数字
返回FindWestValue(参考数组、位置-1、tmpSum、requiredSum);
//使用当前pos:
int[]optionA=FindFewestValues(参考数组,位置-1,currentSum,requiredSum);
//不要使用当前pos:
int[]optionB=FindFewestValues(参考数组,位置-1,tmpSum,requiredSum);
if(optionA==null)
{
返回选项b;
}
其他的
{
optionA=optionA.Append(数组[pos]).ToArray();
如果(选项B==null)
返回选项a;
if(可选A.Length<可选B.Length)
返回选项a;
其他的
返回选项b;
}
}

值是2的幂吗?或者这只是巧合。通常你使用递归方法。网上有成千上万的例子,我个人有几个问题:整数数组总是排序吗?数组中的所有整数都是不同的吗?在“最小值”下,你是什么意思?可能是组合成目标数的数字最少,也就是说,如果数组是[1,2,8,9],那么结果应该是2+9=11,而不是1+2+8=11?@AntonKovachev是的,数组总是排序的。我所说的最少价值观正是你所说的。