答案 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获得。
在这两种算法中,我会选择动态编程,因为它是直接的,并且具有大多数数据集的良好运行时间。
但是如果整数都是非负的并且符合维基百科页面上的描述,那么你可以用多边形时间用近似算法来实现这一点。