如何从给定的数字中找到唯一的组合和(使用C#)?
创建一个输出列表来存储有效的序列,创建一个当前列表来存储在递归树路径中找到的当前序列。一个回溯函数,它将进入递归直到达到目标,否则,它应该回溯到之前的阶段,因为目标小于0。在任何时候,如果目标变为0,则将候选数组添加到结果中,因为候选数组中的值必须加起来等于给定的目标。
如果不是这种情况,则逐个添加候选数组中的元素,并递归地向前移动。
例如,数字是5,我们需要找到构成5的数字。输出将是“1,4”、“2,3”、5。从输出014、023和05可以丢弃。
示例
using System; using System.Collections.Generic; using System.Text; using System.Linq; namespace ConsoleApplication{ public class BackTracking{ public void UniqueCombinationOfNumbersCorrespondsToSum(int n){ int[] array = new int[n + 1]; for (int i = 1; i <= n; i++){ array[i] = i;} List<int> currentList = new List<int>(); List<List<int>> output = new List<List<int>>(); UniqueCombinationSum(array, n, 0, 0, currentList, output); foreach (var item in output){ StringBuilder s = new StringBuilder(); foreach (var item1 in item){ s.Append(item1.ToString()); } Console.WriteLine(s); s = null; } } private void UniqueCombinationSum(int[] array, int target, int sum, int index, List<int> currentList, List<List<int>> output){ if (sum == target){ List<int> newList = new List<int>(); newList.AddRange(currentList); output.Add(newList); return; } else if (sum > target){ return; } else{ for (int i = index; i < array.Length; i++){ currentList.Add(array[i]); UniqueCombinationSum(array, target, sum + array[i], i + 1, currentList, output); currentList.Remove(array[i]); } } } } class Program{ static void Main(string[] args){ BackTracking b = new BackTracking(); b.UniqueCombinationOfNumbersCorrespondsToSum(5); } } } }
输出
14 23 05
广告