-1
A
回答
4
这是一个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;
}
}
}
2
Dynamic Programming将产生最佳运行一个确切的解决方案。维基百科上的The Subset Sum Problem page对算法有一些伪代码。从本质上讲,您可以对所有数字进行排序,并将所有可能的顺序相加,以便最大限度地减少添加次数。运行时间是伪多项式。
对于多项式算法,您可以使用Approximation Algorithm。伪码也可从Subset Sum Problem page获得。
在这两种算法中,我会选择动态编程,因为它非常简单,并且对于大多数数据集具有良好的运行时间。
但是,如果整数都是非负数,并且与维基百科页面上的描述相符,那么实际上可以使用近似算法在多项式时间内完成此操作。
相关问题
- 1. 基于java的算法,如果有,其总和等于x
- 2. 计算数字总和等于x * m的数字总和的数字x的编号
- 3. Java数组总是等于
- 4. 组合谁总和等于n
- 5. Floor(X)模X等于X?
- 6. 总和等于给定数量
- 7. 将数字X分解成组,使得它们的总和等于X中的Matlab
- 8. 获取等于目标的数组项的总和(子集总和)
- 9. 如何从n个数组的数组中找到一个数组(数组)的数组(数组),其总和恰好等于(或几乎等于)数x。
- 10. SQL,基于变量的日期X和X之间的总和
- 11. 在C/C++为x [I] *值Y [i ++]总是等于x [I] * Y [I]
- 12. 价值为x的总和
- 13. 列的总和等于,A - B
- 14. in_array或等于'x'
- 15. Python - 总结大于或等于某个值的数字组合
- 16. MySQL - 当总和小于x时选择
- 17. 计数总和大于或等于k的子集的数量
- 18. 单个数值的总和应该如何等于数组中的父值?
- 19. 查找数组,等于剩余的元素的总和元素
- 20. 如果月份等于数值,Excel总和值为
- 21. 净和还原量不等于总
- 22. PHP总和,如果在阵列等于
- 23. encodeCGSize:forKey:和decodeCGSizeForKey:等效于OS X
- 24. IIF声明帮助 - 总和值大于或等于
- 25. 最快的方式从两个列表找到2号,在总和等于x
- 26. 将n个数字分成两组,每组的总和小于等于k
- 27. 等同于OutputDebugString()的OS X?
- 28. 总计(如果单元格x等于获取单元格y)
- 29. 熊猫等同于“从x组中选择x”by x?
- 30. 将等于一个整数总是等于一个整数吗?
家庭作业问题? – 2009-02-27 17:20:21