c·c++/c 프로그래밍

멱집합 (부분집합이 원소인 집합) 출력하기

바로이순간 2012. 6. 3. 20:12

인풋이 {1,2,3}

이렇게 입력되면

아웃풋이 {{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}}

 

이런식으로 일종의 멱집합으로 출력되게 할수는 없는지요..?? 

3일째 고민중인데 도저히 감이 안잡히네요


--------------------------------------------------------------


#include <stdio.h> 

// 부분집합 출력. 

void print_subset(int set[], int n) { 

    int i; 

    // 부분집합의 원소 출력.

    printf(",{"); 

    for (i=0;i<n-1;++i) 

        printf("%d,", set[i]); 

    printf("%d}",set[n-1]); 


// c(n,r)=c(n-1,r-1)+c(n-1,r) 을 이용한 부분집합 구하기 

// m은 구해야할 부분집합의 크기

// r은 현재까지 구한 부분집합의 갯수

void comb(int subset[], int n, int k, int m, int r) {


 // 만약 남아있는 원소의 갯수가 구해야할 원소보다 작거나

    if (n-k<m-r) return; 


 // 혹은 이미 모든 원소를 다 선택했다면 순환호출을 멈춘다.

 // 모든 원소를 다 구했을 경우 즉 r==m일 때만 출력을 해준다. 

    if (r==m) {

        print_subset(subset, m);

        return ; 

    } 


 // 만약 앞으로 더 구해야할 원소가 남았고, 또 가능하다면

 // k번째 원소를 선택한 경우와 선택하지 않은 두가지 경우를 각각

 // 순환호출로 돌려준다.


// subset의 r번째 원소로 k번째 set의 원소를 넣어 준다.

    subset[r] = k+1; 


// 지금까지 선택한 원소가 r개 였고, 지금 1개 선택했으므로 r+1개를 선택하였다.

    comb(subset, n, k+1, m, r+1); 


// k번째 원소를 선택하지 않았다. 여전히 r개를 가지고 호출을 한다.

// 위에서 넣었던 r번째 원소는 다음 순환호출 때 다른 값이 들어 가기 때문에

// 걱정하지 않아도 좋다.

    comb(subset, n, k+1, m, r); 

int main() { 


 // subset는 r개의 원소를 뽑아넣은 부분집합이다.

    int subset[32]={0,};

    int i, n, r; 


 // set의 크기를 입력받는다. 원소는 1부터 n까지 이다.

    printf("최대값 : "); 

    scanf("%d", &n);


    printf("{{}");

    for(i=1;i<n+1;++i)

        comb(subset, n, 0, i, 0);

    printf("}"); 


    return 0;


위의 프로그램이면 되겠습니다.

입력은 3으로만 주면 됩니다. {1,2,3,4} 의 경우에는 4라고 줍니다.

'c·c++ > c 프로그래밍' 카테고리의 다른 글

중위표현을 후위표현으로  (0) 2012.06.07
진법 변환  (0) 2012.06.06
엔터를 누르지 않고 입력을 받고 실행하기  (0) 2012.06.03
대문자 소문자 숫자세기  (0) 2012.06.02
카운터, 타이머  (0) 2012.06.02