Advertisement
pmcgee

Target Sum - return all sets [using Lists]

Apr 13th, 2021 (edited)
805
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.88 KB | None | 0 0
  1. program Project1;
  2. {$APPTYPE CONSOLE}
  3. uses
  4.   System.SysUtils, Generics.Collections;
  5. //
  6. //  Generate a list of all sub-lists that sum to the target figure.
  7. //
  8. //  Nice reference :  https://stackoverflow.com/questions/9315275/dynamic-tlist-of-tlist
  9.  
  10. function target_sum(const a : TList<integer>; const k,x : integer) : TObjectlist< TList<integer> >;
  11. begin
  12.   if k = a.Count then begin
  13.                         result := TObjectlist< TList<integer> >.create;     //  []
  14.                         exit;
  15.                       end;
  16.  
  17.   if x = a[k]    then begin
  18.                         var single := TList<integer>.Create;                //  []
  19.                         single.add( a[k] );                                 //  [ a[k] ]
  20.                         result    := TObjectlist< TList<integer> >.create;
  21.                         result.add(single);                                 //  [ [a[k]] ]
  22.                         exit;
  23.                       end
  24.   else
  25.                       begin
  26.                         var s := target_sum(a, k + 1, x       );            // not using a[k]
  27.                         var t := target_sum(a, k + 1, x - a[k]);            //     using a[k]
  28.                         if t.count > 0 then
  29.                              for var list in t do begin
  30.                                  list.Insert(0, a[k]);
  31.                                  s.add( list );
  32.                              end
  33.                         else t.free;
  34.                         result := s;
  35.                       end;
  36. end;
  37.  
  38.  
  39. procedure print_list(const list : TList<integer>);
  40. begin
  41.   for var i in list do write(i, ', ');  writeln;
  42. end;
  43.  
  44.  
  45. var
  46.   a : TList<integer>;
  47.   s : TObjectlist< TList<integer> >;
  48. const
  49.   target = 0;
  50.  
  51. begin
  52.   ReportMemoryLeaksOnShutdown := true;                              //  leaking objects
  53.  
  54.   a := TList<integer>.Create;
  55.   a.AddRange([1, 4, 5, 2, 7, 8, -3, -5, -6, 9, 3, -7, -1, 5, 6]);   // result = 436
  56.   //a.addrange([1,2,-1,-2]);    // result = 3
  57.  
  58.   s := target_sum(a,0,target);
  59.   write('Target = ', target, ' from : '); print_list(a);  writeln;
  60.  
  61.   writeln('# Solutions = ', s.count); writeln;
  62.  
  63.   if s.Count > 0 then for var list in s do print_list(list)
  64.                  else writeln('x');
  65.  
  66.   s.free;
  67.   a.free;
  68.   readln;
  69. end.
  70.  
  71.  
  72. (*  Javascript
  73.  
  74. function target_sum(a, k, x) {
  75.     if (k == a.length) return [];
  76.     if (a[k] == x) {
  77.         return [ [a[k]] ];
  78.     } else {
  79.         var s = target_sum(a, k + 1, x); // not using a[k]
  80.         var t = target_sum(a, k + 1, x - a[k]); // using a[k]
  81.         for (var i = 0; i < t.length; ++i) {
  82.             t[i].unshift(a[k]); // a[k] is part of the solution
  83.             s.push(t[i]); // merge t[] into s[]
  84.         }
  85.         return s;
  86.     }
  87. }
  88.  
  89. var s = target_sum([1, 4, 5, 2, 7, 8, -3, -5, -6, 9, 3, -7, -1, 5, 6], 0, 0);
  90. for (var i = 0; i < s.length; ++i)
  91.     console.log(s[i].join(","));
  92.  
  93. *)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement