สร้างรายการผลลัพธ์เพื่อจัดเก็บลำดับที่ถูกต้อง สร้างรายการปัจจุบันที่จะจัดเก็บลำดับปัจจุบันที่พบในเส้นทางของแผนผังการเรียกซ้ำ ฟังก์ชันย้อนรอยที่จะเข้าสู่การเรียกซ้ำจนกว่าเป้าหมายจะสำเร็จ มิฉะนั้น ควรย้อนย้อนไปยังเฟสก่อนหน้าเนื่องจากเป้าหมายมีค่าน้อยกว่า 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