using System; using System.Collections.Generic; using System.Linq; using System.Text; public class Test { public static void Main() { int[] a = Enumerable.Range(1,14).ToArray(); int maxlen = a.Length/2; var res = MakePairs(a, maxlen); Console.WriteLine(res[res.Count-1]); } static List> MakePairs(int[] nums, int maxlen) { var sums = new List(); for(int i = 0; i < nums.Length; i++) { var num = nums[i]; for(int j = sums.Count - 1; j >= 0; j--) { var list = sums[j]; if(list.Length >= maxlen) continue; var node = new Node { Number = num, Next = list.First }; var nodeList = new NodeList { First = node, Length = list.Length + 1, Sum = list.Sum + num }; sums.Add(nodeList); } sums.Add(new NodeList { First = new Node { Number = num }, Length = 1, Sum = num }); } // string.Join(",", sums.Select(x => x.Sum.ToString()).ToArray() ).Dump(); sums.Sort((x,y) => x.Sum.CompareTo(y.Sum)); var res = new List>(); for(int i = 0; i < sums.Count; i++) for(int j = i + 1; j < sums.Count; j++) { if(sums[i].Sum != sums[j].Sum) break; res.Add(Tuple.Create(sums[i], sums[j])); } return res; } class Node { public int Number { get; set; } public Node Next { get; set; } // public Node(int number, Node next = null) // { // Number = number; // Next = next; // } } class NodeList { public Node First { get; set; } public int Length { get; set; } public int Sum { get; set; } public override string ToString() { var sb = new StringBuilder(); var cur = First; for(int i = 0; i < Length; i++) { sb.Append(cur.Number.ToString()); sb.Append(','); cur = cur.Next; } if(sb.Length > 0) sb.Length -= 1; return sb.ToString(); } // public NodeList(Node first, int length, int sum) // { // First = first; // Length = length; // Sum = sum; // } } class Result { public NodeList First { get; set; } public NodeList Second { get; set; } public int TailIndex { get; set; } } }