using System; public class Test { private static int[,] Assing(int[] subjects, int[] controls, int count) { if (count * subjects.Length > controls.Length) { throw new ArgumentException(); } Array.Sort(subjects); Array.Sort(controls); var subjTimesCount = new int[subjects.Length*count]; for (var i = 0 ; i < subjects.Length ; i++) { for (var j = 0 ; j != count ; j++) { subjTimesCount[i*count + j] = subjects[i]; } } var mem = new int[subjTimesCount.Length,controls.Length]; for (var i = 0; i < subjects.Length; i++) { for (var j = 0; j != count; j++) { mem[i,j] = -1; } } var assignments = new int[subjTimesCount.Length]; var x = RecAssign(subjTimesCount, controls, mem, 0, 0, assignments); Console.WriteLine(x); var res = new int[subjects.Length,count]; for (var i = 0; i < subjects.Length; i++) { for (var j = 0; j != count; j++) { res[i, j] = assignments[i*count + j]; } } return res; } private static int RecAssign(int[] subjects, int[] controls, int[,] mem, int sp, int cp, int[] assignments) { if (sp == subjects.Length) { return 0; } if (mem[sp, cp] > 0) { return mem[sp, cp]; } var res = Math.Abs(subjects[sp] - controls[cp]) + RecAssign(subjects, controls, mem, sp + 1, cp + 1, assignments); assignments[sp] = cp; if (cp+1+subjects.Length-sp < controls.Length) { var alt = RecAssign(subjects, controls, mem, sp, cp + 1, assignments); if (alt < res) { res = alt; } else { assignments[sp] = cp; } } mem[sp, cp] = res; return res; } static void Main() { var subj = new[] {190, 100}; var ctrl = new[] {70, 180, 220, 240, 500, 600, 600}; var res = Assing(subj, ctrl, 2); for (var i = 0 ; i != subj.Length ; i++) { for (var j = 0; j != 2; j++) { Console.Error.WriteLine( "{0}:{1} -- subj={2} loc={3} diff:{4}" , i , j , subj[i] , ctrl[res[i,j]] , Math.Abs(subj[i] - ctrl[res[i,j]]) ); } } } }