-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