Para resolver alguns tipos de problemas, precisamos construir de um algoritmo para gerar todos os subconjuntos para encontrar subconjunto em particular que satisfaz uma dada propriedade.
O algoritmo para construir todos os subconjuntos pode ser usado em algoritmo de busca exaustiva que consiste em enumerar explicitamente todas os subconjuntos e testá-los e/ou em um algoritmo de enumeração implícita.
Algoritmo para gerar todos os subconjuntos#include <stdio.h> #include <stdlib.h> int conj[32]; int cont; void subconjunto(int i, int n){ int j; if(i>n){ printf("%d subconjunto:",++cont); for(j=1;j<=n;j++) if(conj[j]==1) printf("%d ",j); printf("\n"); }else{ conj[i] = 1; subconjunto(i+1,n); conj[i] = 0; subconjunto(i+1,n); } } int main(){ int n; scanf("%d",&n); cont = 0; subconjunto(1,n); return 0; }
Saída
3
1 subconjunto:1 2 3
2 subconjunto:1 2
3 subconjunto:1 3
4 subconjunto:1
5 subconjunto:2 3
6 subconjunto:2
7 subconjunto:3
8 subconjunto:
Tabela da execução do algoritmo
Gerando todos os subconjunto usando bitsmask
Algoritmo para gerar todos os subconjuntos
#include <stdio.h> #include <stdlib.h> int main(){ int n,i,j; scanf("%d",&n); for(i=0;i<(1<<n);i++){ printf("subconjunto %d: ",i); for(j=0;j<n;j++){ if((i & (1<<j))!= 0){ printf("%d ",j+1); } } printf("\n"); } return 0; }
Saída
3
subconjunto 0:
subconjunto 1: 1
subconjunto 2: 2
subconjunto 3: 1 2
subconjunto 4: 3
subconjunto 5: 1 3
subconjunto 6: 2 3
subconjunto 7: 1 2 3
2 comentários:
pq no primeiro algoritmo vc começa o for de 1?
Erro meu!
Postar um comentário