Alx09

Ex 24 Proiect TP

May 8th, 2020
1,956
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.11 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*
  4.  Am eliminat posibilitatile de genul 1 2 1 , 2 1 1, 1 1 2
  5.  E bazat pe un vector de pointer
  6.  Am sortat reperele si dupa am lucrat cu ajutoul vectroului de pointeri
  7.  Am optimizat memoria mult, si numarul de cazuri posibile l-am redus
  8.  Sper ca e bine ca am eliminat cazurile de la inceput.
  9. */
  10.  
  11. unsigned valid(unsigned short * rep, unsigned short**st, unsigned short n, unsigned short varf) {
  12.     unsigned short i, j, ok;
  13.     for (i = 1; i <= n; i++) {
  14.         ok = 1;
  15.         for (j = 1; j <= varf; j++)
  16.             if (rep + i == *(st + j)) {
  17.                 ok = 0;
  18.                 break;
  19.             }
  20.             if (ok) return 0;
  21.        
  22.     }
  23.     return 1;
  24. }
  25.  
  26. int main() {
  27.     unsigned short L, n, suma, i, varf, *stiva[1001];
  28.     unsigned short repere[11];
  29.     FILE *f;
  30.     f = fopen("in.txt", "r");
  31.     fscanf(f, "%hu%hu", &L, &n);
  32.     for (i = 1; i <= n; i++)
  33.         fscanf(f, "%hu", &repere[i]);
  34.     fclose(f);
  35.     do {  // Bubble sort
  36.         suma = 0; // contor
  37.         for (i = 1; i <= n; i++)
  38.             if (repere[i] > repere[i + 1])
  39.                 suma = 1, repere[i] ^= repere[i + 1], repere[i + 1] ^= repere[i], repere[i] ^= repere[i + 1];
  40.     } while (suma);
  41.     // Se pot aloca vectori de pointer dinamic? pentru ca avem nevoie de o stiva de L/repere[1] + 2 si sa nu fac risipa
  42.     suma = repere[1];// initializari
  43.     varf = 1;
  44.     stiva[0] = repere + varf; // sa nu am eroare cand varf = 0
  45.     stiva[varf] = repere + varf;
  46.     f = fopen("out.txt", "w");
  47.     while (varf) { // se opreste cand stiva este goala
  48.         if (suma < L) // daca suma este mai mica adaugam adresa varfului la varf urmator si adunam la suma
  49.             stiva[varf + 1] = stiva[varf], suma += *stiva[varf++];
  50.         else {
  51.             if (suma == L  && valid(repere, stiva, n, varf)) { // daca s = l se afiseaza (nu am mai stat de functii)
  52.                 for (i = 1; i <= varf; i++)
  53.                     fprintf(f, "%hu ", *stiva[i]);
  54.                 fprintf(f, "\n");
  55.             }
  56.             suma -= *stiva[varf--]; // scadem din suma actual varf dupa care scadem varful
  57.             suma -= *stiva[varf]; //scadem din suma noul varf
  58.             stiva[varf]++; //noului varf i se atrebuie adresa urmatorul element din repere
  59.             suma += *stiva[varf]; // se adauga valoarea elementului din repere
  60.         }
  61.  
  62.     }
  63.     fclose(f);
  64.     return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment