求和数等于X的Sum数组值

时间:2009-02-27 17:17:18

标签: algorithm language-agnostic sum

我有一个整数集合。我需要得到值总和等于X的所有可能性。

我需要像this这样的东西。

它可以写成:delphi,c#,php,RoR,python,cobol,vb,vb.net

2 个答案:

答案 0 :(得分:5)

那是subset sum problem。它是NP-Complete

实现此目的的唯一方法是生成所有可能的组合并比较总和值。但是存在优化技术。

这是C#中的一个:

static class Program
{
    static int TargetSum = 10;
    static int[] InputData = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    static void Main()
    {
        // find all permutations
        var permutations = Permute(InputData);

        // check each permutation for the sum
        foreach (var item in permutations) {

            if (item.Sum() == TargetSum) {

                Console.Write(string.Join(" + ", item.Select(n => n.ToString()).ToArray()));
                Console.Write(" = " + TargetSum.ToString());
                Console.WriteLine();

            }
        }

        Console.ReadKey();
    }

    static IEnumerable<int[]> Permute(int[] data) { return Permute(data, 0); }

    static IEnumerable<int[]> Permute(int[] data, int level)
    {
        // reached the edge yet? backtrack one step if so.
        if (level >= data.Length) yield break;

        // yield the first #level elements
        yield return data.Take(level + 1).ToArray();

        // permute the remaining elements
        for (int i = level + 1; i < data.Length; i++) {
            var temp = data[level];
            data[level] = data[i];
            data[i] = temp;

            foreach (var item in Permute(data, level + 1))
                yield return item;

            temp = data[i];
            data[i] = data[level];
            data[level] = temp;
        }

    }
}

答案 1 :(得分:2)

Dynamic Programming将为精确解决方案提供最佳运行时间。维基百科上的The Subset Sum Problem page有一些算法的伪代码。基本上,您订购所有数字并按顺序添加所有可能的顺序,以便最大限度地减少添加数量。运行时是伪多项式。

对于多项式算法,您可以使用Approximation Algorithm。伪代码也可以在Subset Sum Problem page获得。

在这两种算法中,我会选择动态编程,因为它是直接的,并且具有大多数数据集的良好运行时间。

但是如果整数都是非负的并且符合维基百科页面上的描述,那么你可以用多边形时间用近似算法来实现这一点。