Advertisement
icatalin

descompunere numere bkt

May 1st, 2018
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.08 KB | None | 0 0
  1. //Descompunerea unui numar natural ca suma de numere naturale nenule, cu urmatoarele variante:
  2. //a. descompuneri distincte
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. int n = 15, x[101];
  8.  
  9. void bkt(int k)
  10. {
  11.     int i, v, s;
  12.  
  13.     for (v = x[k-1]; v <= n - k + 1; v++)
  14.     {
  15.         x[k] = v;
  16.         s = 0;
  17.         for (i = 1; i <= k; i++)
  18.             s = s + x[i];
  19.  
  20.             if (s <= n)
  21.                 if (s == n)
  22.                     {
  23.                         for (i = 1; i <= k; i++)
  24.                             printf("%d ",x[i]);
  25.                         printf("\n");
  26.                     }
  27.                 else bkt(k + 1);
  28.     }
  29. }
  30.  
  31.  
  32. int main()
  33. {
  34.     x[0] = 1;
  35.     bkt(1);
  36.  
  37.     return 0;
  38. }
  39.  
  40.  
  41. //b. descompuneri distincte cu termeni distincti.
  42. #include <stdio.h>
  43.  
  44. int n, st[100], x[100];
  45.  
  46. int valid(int p)
  47. {
  48.     int i;
  49.  
  50.     if (p > 1)
  51.         if (st[p] < st[p-1] || st[p] == st[p-1]) // se verifica ordinea crescatoare
  52.         return 0;
  53.  
  54.     int s = 0;
  55.  
  56.     for (i=1; i<=p; i++)
  57.         s += st[i];
  58.  
  59.     if (s > n)
  60.         return 0;
  61.  
  62.     return 1;
  63. }
  64.  
  65. int solutie(int p)
  66. {
  67.     int i, s = 0;
  68.  
  69.     for (i=1; i<=p; i++)
  70.         s = s + st[i];
  71.  
  72.     if (s == n)
  73.         return 1;
  74.  
  75.     return 0;
  76. }
  77.  
  78. void afis(int p)
  79. {
  80.     int i;
  81.     for (i=1; i<=p; i++)
  82.         printf("%d ", st[i]);
  83.     printf("\n");
  84. }
  85.  
  86. void backtr(int p)
  87. {
  88.     int i;
  89.  
  90.     for (i=1; i<=n; i++)
  91.     {
  92.         st[p] = i;
  93.  
  94.         if (valid(p))
  95.             if (solutie(p))
  96.                 afis(p);
  97.             else
  98.                 backtr(p+1);
  99.     }
  100. }
  101.  
  102.  
  103. int main()
  104. {
  105.     scanf("%d",&n);
  106.  
  107.     backtr(1);
  108.  
  109.     return 0;
  110. }
  111.  
  112. // varianta cu comentarii
  113. //Descompunerea unui numar natural ca suma de numere naturale nenule, cu urmatoarele variante:
  114. //a. descompuneri distincte
  115. //b. descompuneri distincte cu termeni distincti.
  116. #include <stdio.h>
  117.  
  118. int n, st[100]; // n - numarul care va fi descompus, st - stiva
  119.  
  120. int valid(int p)
  121. {
  122.     int i;
  123.  
  124.     if (p > 1) // pentru punctul b) doar adaugam in if-ul de mai jos conditia "|| st[p] == st[p-1]", iar pentru a) o scoatem
  125.         if (st[p] < st[p-1] || st[p] == st[p-1]) // se verifica ordinea crescatoare si ca termenii unei descompuneri sa fie distincti ( in cazul punctului b)
  126.         return 0;
  127.  
  128.     int s = 0;
  129.  
  130.     for (i=1; i<=p; i++)
  131.         s += st[i];
  132.  
  133.     if (s > n) // se verifica ca nu cumva suma din stiva sa depaseasca numarul
  134.         return 0;
  135.  
  136.     return 1;
  137. }
  138.  
  139. int solutie(int p)
  140. {
  141.     int i, s = 0;
  142.  
  143.     for (i=1; i<=p; i++)
  144.         s = s + st[i];
  145.  
  146.     if (s == n) // pentru a fi solutie trebuie ca Ssuma din stiva sa fie egala cu n
  147.         return 1;
  148.  
  149.     return 0;
  150. }
  151.  
  152. void afis(int p)
  153. {
  154.     int i;
  155.     for (i=1; i<=p; i++)
  156.         printf("%d ", st[i]);
  157.     printf("\n");
  158. }
  159.  
  160. void backtr(int p)
  161. {
  162.     int i;
  163.  
  164.     for (i=1; i<=n; i++)
  165.     {
  166.         st[p] = i;
  167.  
  168.         if (valid(p))
  169.             if (solutie(p))
  170.                 afis(p);
  171.             else
  172.                 backtr(p+1);
  173.     }
  174. }
  175.  
  176.  
  177. int main()
  178. {
  179.     scanf("%d",&n);
  180.  
  181.     backtr(1);
  182.  
  183.     return 0;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement