Advertisement
IISergeyII

Untitled

May 16th, 2018
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 1.72 KB | None | 0 0
  1. var
  2. ANS : array[1..100000] of integer;
  3. k: integer;
  4.  
  5. type
  6.   TCoinsSet = array[1..16] of integer;
  7.  
  8.  
  9.   function AmountCoins(N: integer; M: integer; const A: TCoinsSet): integer;
  10.   var
  11.     MinAmount, CurAmount: integer;
  12.     Sum: integer;
  13.    
  14.     k := 1;
  15.  
  16.     procedure Backtracking(NCoin: integer);
  17.     var
  18.       i: integer;
  19.     begin
  20.       if NCoin > M then
  21.         Exit;
  22.       if Sum > N then
  23.         exit;
  24.  
  25.       for i := 0 to 2 do
  26.       begin
  27.         if Sum = N then
  28.         begin
  29.           if CurAmount < MinAmount then
  30.             MinAmount := CurAmount;
  31.         end;
  32.         Backtracking(NCoin + 1);
  33.         Inc(CurAmount);
  34.         Sum := Sum + A[NCoin];
  35.         ANS[k] := A[NCoin];
  36.         Inc(k);
  37.       end;
  38.  
  39.       Dec(CurAmount, 3);
  40.       Sum := Sum - 3 * A[NCoin];
  41.     end;
  42.  
  43.   begin
  44.     MinAmount := M + M + 1;
  45.     CurAmount := 0;
  46.     Sum := 0;
  47.     Backtracking(1);
  48.     if MinAmount > M + M then
  49.       MinAmount := 0;
  50.     AmountCoins := MinAmount;
  51.   end;
  52.  
  53. var
  54.   N: integer;
  55.   M: integer;
  56.   A: TCoinsSet;
  57.   Summ: integer;
  58.   i, j, ans1: integer;
  59. begin
  60.   Summ := 0;
  61.  
  62.   readln(N, M);
  63.   for i := 1 to M do
  64.   begin
  65.     Read(A[i]);
  66.     Summ := Summ + A[i];
  67.   end;
  68.   if Summ + Summ < N then
  69.   begin
  70.     writeln('-1');
  71.   end
  72.   else
  73.   begin
  74.     ans1 := AmountCoins(N, M, A);
  75.     writeln(ans1);
  76.     for i := 1 to 10000 do
  77.       begin
  78.       write(ANS[i], ' ');
  79.      
  80.       if (ANS[i] = 0) then
  81.         begin
  82.           //writeln(ANS[i], ' i ', i, ' ans1 ', ans1);
  83.           for j := i-ans1 to i-1 do
  84.             begin
  85.             writeln('!!!!!!!!!');
  86.               write(ANS[j], ' ');
  87.             end;
  88.           break;
  89.         end;
  90.       end;
  91.   end;
  92.  
  93. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement