Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- /*O bară are lungimea L (1<=L<=1000). Se consideră N (1<=N<=10) repere de lungimi diferite.
- Să se genereze toate posibilităţile de a tăia bara după reperele existente, fără să rămână rest la
- tăiere, fiecare reper fiind folosit cel puţin o dată. Se citesc dintr-un fişier text, de pe primul rând,
- lungimea barei – L şi numărul de repere – n, iar de pe următorul rând, reperele. Numerele de pe un
- rând sunt separate prin spaţiu
- */
- //Ca arma principala, am folosit stiva.
- int main() {
- unsigned short L, n, c, i, varf, *stiva[1001];
- unsigned short repere[11];
- FILE* f;
- f = fopen("in.txt", "r");
- fscanf(f, "%hu%hu", &L, &n);
- //Citirea din fisier a reperelor.
- for (i = 1; i <= n; i++) {
- fscanf(f, "%hu", &repere[i]);
- L -= repere[i];
- }
- fclose(f);
- //Sortarea in ordine crescatoare a reperelor (bubble sort).
- do {
- c = 0;
- for (i = 1; i <= n; i++)
- if (repere[i] > repere[i + 1])
- {
- c = 1;
- repere[i] ^= repere[i + 1];
- repere[i + 1] ^= repere[i];
- repere[i] ^= repere[i + 1];
- }
- } while (c);
- c = repere[1];
- varf = 1;
- stiva[0] = repere + varf;
- stiva[varf] = repere + varf;
- f = fopen("out.txt", "w");
- //Acest while se opreste daca stiva este goala.
- while (varf) {
- //Daca suma este mai mica, adaugam adresa varfului la varful urmator si adunam la suma.
- if (c < L)
- {
- stiva[varf + 1] = stiva[varf];
- c += *stiva[varf++];
- }
- else
- {
- //Daca c = l, afisam.
- if (c == L)
- {
- for (i = 1; i <= n; i++)
- fprintf(f, "%hu ", repere[i]);
- for (i = 1; i <= varf; i++)
- fprintf(f, "%hu ", *stiva[i]);
- fprintf(f, "\n");
- }
- c -= *stiva[varf--];
- c -= *stiva[varf];
- stiva[varf]++;
- c += *stiva[varf];
- }
- }
- fclose(f);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment