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