icatalin

plata sumei S cu N monede

May 9th, 2018
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.91 KB | None | 0 0
  1. //Se citesc valorile a N monede (printre ele exista si moneda de valoare 1, pentru a ne asigura
  2. //ca se poate realiza plata). Sa se genereze toate modalitatile de a plati o suma S, folosind
  3. //cele N monede.
  4.  
  5.  
  6. #include <stdio.h>
  7.  
  8. int S, n, st[1000], x[100];
  9.  
  10. int valid(int p)
  11. {
  12.     if (p>1)
  13.         if (st[p]<st[p-1])
  14.         return 0;
  15.  
  16.     int i, s = 0;
  17.  
  18.     for (i = 1; i <= p; i++)
  19.         s = s + st[i];
  20.  
  21.     if (s > S)
  22.         return 0;
  23.  
  24.     return 1;
  25. }
  26.  
  27. int solutie (int p)
  28. {
  29.     int i, s = 0;
  30.  
  31.     for (i = 1; i <= p; i++)
  32.         s = s + st[i];
  33.  
  34.     if (s == S)
  35.         return 1;
  36.  
  37.     return 0;
  38. }
  39.  
  40. void afis(int p)
  41. {
  42.     int i;
  43.  
  44.     for (i = 1; i <= p; i++)
  45.         printf("%d ",st[i]);
  46.  
  47.     printf("\n");
  48. }
  49.  
  50. void backtr(int p)
  51. {
  52.     int i;
  53.  
  54.     for (i=0; i<=n; i++)
  55.     {
  56.         st[p] = x[i];
  57.  
  58.         if (valid(p))
  59.             if (solutie(p))
  60.                 afis(p);
  61.             else
  62.                 backtr(p+1);
  63.     }
  64. }
  65.  
  66. int main()
  67. {
  68.  
  69.     FILE *fin;
  70.     fin = fopen("date.in","r");
  71.  
  72.     int i;
  73.  
  74.     fscanf(fin,"%d",&n);
  75.  
  76.     x[0] = 1;
  77.     for (i = 1; i <= n; i++)
  78.         fscanf(fin,"%d",&x[i]);
  79.  
  80.     fscanf(fin,"%d",&S);
  81.  
  82.     backtr(1);
  83.  
  84.     return 0;
  85. }
  86.  
  87. // varianta 2, comentata
  88.  
  89. //Se citesc valorile a N monede (printre ele exista si moneda de valoare 1, pentru a ne asigura
  90. //ca se poate realiza plata). Sa se genereze toate modalitatile de a plati o suma S, folosind
  91. //cele N monede.
  92. //In date.in ordinea este: N \n monedele... \n S
  93.  
  94. #include <stdio.h>
  95.  
  96. int S, n, st[1000], x[100]; // n - numarul de monede, st - stiva, x - vectorul in care sunt memorate monedele
  97.  
  98. int valid(int p)
  99. {
  100.     if (p>1)
  101.         if (st[p]<st[p-1]) // am ales sa afisez mondele in ordine crescatoare, lexicografica
  102.         return 0; // daca nu sunt in ordine crescatoare nu e valid
  103.  
  104.     int i, s = 0;
  105.  
  106.     for (i = 1; i <= p; i++)
  107.         s = s + st[i];
  108.  
  109.     if (s > S) // daca suma monedelor este mai mare decat suma S data atunci nu e valid
  110.         return 0;
  111.  
  112.     return 1;
  113. }
  114.  
  115. int solutie (int p)
  116. {
  117.     int i, s = 0;
  118.  
  119.     for (i = 1; i <= p; i++)
  120.         s = s + st[i];
  121.  
  122.     if (s == S) // pentru a fi solutie suma mondelor trebuie sa fie egala cu suma S data
  123.         return 1;
  124.  
  125.     return 0;
  126. }
  127.  
  128. void afis(int p)
  129. {
  130.     int i;
  131.  
  132.     for (i = 1; i <= p; i++)
  133.         printf("%d ",st[i]);
  134.  
  135.     printf("\n");
  136. }
  137.  
  138. void backtr(int p)
  139. {
  140.     int i;
  141.  
  142.     for (i=0; i<=n; i++)
  143.     {
  144.         st[p] = x[i];
  145.  
  146.         if (valid(p))
  147.             if (solutie(p))
  148.                 afis(p);
  149.             else
  150.                 backtr(p+1);
  151.     }
  152. }
  153.  
  154. int main()
  155. {
  156.  
  157.     FILE *fin;
  158.     fin = fopen("date.in","r");
  159.  
  160.     int i;
  161.  
  162.     fscanf(fin,"%d",&n);
  163.  
  164.     x[0] = 1; // moneda 1 este implicit folosita
  165.     for (i = 1; i <= n; i++)
  166.         fscanf(fin,"%d",&x[i]); // citim monezile
  167.  
  168.     fscanf(fin,"%d",&S);
  169.  
  170.     backtr(1);
  171.  
  172.     return 0;
  173. }
Advertisement
Add Comment
Please, Sign In to add comment