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.
- */
- unsigned valid(unsigned short * rep, unsigned short**st, unsigned short n, unsigned short varf) {
- unsigned short i, j, ok;
- for (i = 1; i <= n; i++) {
- ok = 1;
- for (j = 1; j <= varf; j++)
- if (rep + i == *(st + j)) {
- ok = 0;
- break;
- }
- if (ok) return 0;
- }
- return 1;
- }
- int main() {
- unsigned short L, n, suma, i, varf, *stiva[1001];
- unsigned short repere[11];
- FILE *f;
- f = fopen("in.txt", "r");
- fscanf(f, "%hu%hu", &L, &n);
- for (i = 1; i <= n; i++)
- fscanf(f, "%hu", &repere[i]);
- fclose(f);
- do { // Bubble sort
- suma = 0; // contor
- 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;
- f = fopen("out.txt", "w");
- 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 && valid(repere, stiva, n, varf)) { // daca s = l se afiseaza (nu am mai stat de functii)
- for (i = 1; i <= varf; i++)
- fprintf(f, "%hu ", *stiva[i]);
- fprintf(f, "\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 elementului din repere
- }
- }
- fclose(f);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment