Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- /*
- Am eliminat posibilitatile de genul 1 2 1 , 2 1 1, 1 1 2
- E bazat pe un vector de pointer
- Am sortat reperele si dupa am lucrat cu ajutoul vectroului de pointeri
- Am optimizat memoria mult, si numarul de cazuri posibile l-am redus
- Sper ca e bine ca am eliminat cazurile de la inceput.
- */
- int main() {
- unsigned L, n, suma, i = 1, varf, *stiva[1001];
- unsigned repere[11];
- FILE *f;
- f = fopen("in.txt", "r");
- fscanf(f, "%u%u", &L, &n);
- for (i = 1; i <= n; i++)
- fscanf(f, "%u", &repere[i]);
- do { // Bubble sort
- suma = 0;
- for (i = 1; i <= n; i++)
- if (repere[i] > repere[i + 1])
- suma = 1,repere[i] ^= repere[i + 1], repere[i + 1] ^= repere[i], repere[i] ^= repere[i + 1];
- } while (suma);
- // Se pot aloca vectori de pointer dinamic? pentru ca avem nevoie de o stiva de L/repere[1] + 2 si sa nu fac risipa
- suma = repere[1];// initializari
- varf = 1;
- stiva[0] = repere + varf; // sa nu am eroare cand varf = 0
- stiva[varf] = repere + varf;
- while(varf) { // se opreste cand stiva este goala
- if (suma < L) // daca suma este mai mica adaugam adresa varfului la varf urmator si adunam la suma
- stiva[varf + 1] = stiva[varf], suma += *stiva[varf++];
- else {
- if (suma == L) { // daca s = l se afiseaza (nu am mai stat de functii)
- for (i = 1; i <= varf; i++)
- printf("%u ", *stiva[i]);
- printf("\n");
- }
- suma -= *stiva[varf--]; // scadem din suma actual varf dupa care scadem varful
- suma -= *stiva[varf]; //scadem din suma noul varf
- stiva[varf]++; //noului varf i se atrebuie adresa urmatorul element din repere
- suma += *stiva[varf]; // se adauga valoarea elemtnul din repere
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment