Problem z wyświetleniem wszystkich podzbiorów

0

Witam. Mam problem z wyświetleniem wszystkich podzbiorów. Chciałbym poprosić o pomoc w rozwiązaniu tego problemu.
n6k3.png

#include <stdio.h>
#include <stdlib.h>

int sprawdz_czy_da_sie_zwiekszyc_male(int* tablica, int ile_elementow){
	int index;
	//sprawdz indexy od 0 do k 
	for(index=0;index<ile_elementow;index++){
		if(tablica[index]+1<tablica[index+1]){
			return 1;
		}
	}
	
	return 0;
}

void wypisz(int* tablica, int ile_elementow){
	int w = 0;
	for(;w<ile_elementow;w++){
		printf("%d", tablica[w]);
	}
	printf("\n");
}

void zwieksz_zaczynajac_od_pierwszego_elementu(int* tablica, int k_elementow){
	int index;
	
	for(index=0;index<k_elementow;index++){
		if(tablica[index]+1<tablica[index+1]){
			tablica[index]++;
			wypisz(tablica,k_elementow);
		}
	}	
}

void zmniejsz_male(int* tablica, int ile_elementow){
	int index;
	int wartosc=1;
	for(index=0;index<ile_elementow;++index){
		tablica[index]=wartosc;
		wartosc++;
		
	}
}

void podzbiory(int n, int k_elementow,int tab[])
{   
	if(sprawdz_czy_da_sie_zwiekszyc_male(tab, k_elementow)){
		zwieksz_zaczynajac_od_pierwszego_elementu(tab, k_elementow);
	}else{
		if(tab[k_elementow-1]!=n){
			tab[k_elementow-1]++;
			wypisz(tab, k_elementow);
			zmniejsz_male(tab, k_elementow-1);
		}else{
			printf("Ostatni element ma wartosc n.\n");
			if(!sprawdz_czy_da_sie_zwiekszyc_male(tab, k_elementow)){
				return;
			}		
		}
	}	
	podzbiory(n,k_elementow, tab);   
 }       

 int main(void)
{
    int i=0,n,k;
    printf("Podaj n\n");
    scanf("%d", &n);
    printf("Podaj k\n");
    scanf("%d", &k);
    
	int tab[n];
    for(i=0;i<n;i++)
	{
		tab[i]=i+1;	
	}
	
    wypisz(tab, k);
    podzbiory(n,k,tab);
}
0

Podaj treść zadania i opisz sensownie problem – podaj co konkretnie nie działa prawidłowo.

0
furious programming napisał(a):

Podaj treść zadania i opisz sensownie problem – podaj co konkretnie nie działa prawidłowo.

Problem polega na tym, że nie są wypisywanie wszystkie podzbiory oraz niektóre powtórzone. Problem pewnie leży gdzieś w zmniejszaniu indeksu tablicy, ale nie potrafię znaleźć błędu.

Treść zadania:
alg.png

Tak to wygląda rozpisany algorytm
na_papierze.png

1

Twórczość ludzi w dziedzinie skomplikowania problemu jak zwykle jest nieograniczona:

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

void
podzbiory(int *tab, int pos, int k, int n)
{
	int ii;

	if (pos == k) {
		for (ii = 0; ii < pos; ii++) {
			printf("%d ", tab[ii]);
		}
		printf("\n");
		return;
	}

	for (ii = pos > 0 ? tab[pos-1] + 1 : 1; ii <= n; ii++) {
		tab[pos] = ii;
		podzbiory(tab, pos + 1, k, n);
		tab[pos] = 0;
	}
}

int
main()
{
	int *tab;
	int k, n;

	printf("n = ");
	scanf("%d", &n);
	printf("k = ");
	scanf("%d", &k);

	tab = (int *)calloc(k, sizeof(*tab));
	assert(tab != NULL);

	podzbiory(tab, 0, k, n);
	free(tab);
	return (0);
}

Edit: minor style.
Edit 2: usunięcie UB

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.