求幂集的算法

所谓幂集,就是一个集合的子集的集合。

下面是两个不同的实现。

1. 

#include "stack.h"
#include <stdio.h>

void PowerSet(int i, int *a, int size_of_a, struct stack *s)
{
	if( i == size_of_a)
	{
		int k = 0;
		int len = size(s);
		while(k < len)
		{
			int tmp = 0;
			peek(s, k, &tmp);
			printf("%d ", tmp);
			k++;
		}
		printf("\n");
	}
	else
	{
		push(s, a[i]);
		PowerSet(i + 1, a, size_of_a,  s);
		int tmp;
		pop(s, &tmp);
		PowerSet(i + 1, a, size_of_a, s);
	}
}

int main(int argc, char **argv)
{
	int a[] = {100, 89, 3};
	struct stack s;
	init(&s);
	PowerSet(0, a, 3, &s);
	return 0;
}
stack代码如下:

#ifndef _STACK_QUEUE_H_
#define _STACK_QUEUE_H_

#define MAX_STACK_SIZE 100

#ifndef bool
typedef unsigned char bool;
#endif

#ifndef true
#define true 1
#endif

#ifndef false
#define false 0
#endif

struct stack
{
	int array[MAX_STACK_SIZE];
	int top;
};

void init(struct stack *pStack);
bool pop(struct stack *pStack, int *pElement);
bool push(struct stack *pStack, int element);
int size(struct stack *pStack);
bool peek(struct stack *pStack, int index, int *element);
#endif

#include "stack.h"
#include <stdio.h>

void init(struct stack *pStack)
{
	pStack->top = -1;
}

bool push(struct stack *pStack, int element)
{
	if(pStack->top >= MAX_STACK_SIZE - 1)
	{
		printf("stack is full\n");
		return false;
	} 

	pStack->top++;
	pStack->array[pStack->top] = element;

	return true;
}

bool pop(struct stack *pStack, int *pElement)
{
	if(pStack->top < 0)
	{
		printf("stack is empty\n");
		return false;
	}

	*pElement = pStack->array[pStack->top];

	pStack->top--;

	return true;
}

int size(struct stack *pStack)
{
	return pStack->top + 1;
}

bool peek(struct stack *pStack, int index, int *element)
{
	if(index >= size(pStack))
	{
		return false;
	}

	*element = pStack->array[index];
	return true;
}
实现2:

static int b[3];
    void backtrack(int a[], int k, int n)  
    {  
        if(k == n - 1)  
        {  
            int i;  
            for(i = 0; i <= k; i++)  
            {  
                if(a[i] == 1)  
                {  
                    printf("%d ", b[i]);  
                }  
            }  
            printf("\n");  
        }  
        else  
        {  
            int c[2] = {1, 0};  
            int i;  
            k++;  
            for(i = 0; i < 2; i++)  
            {  
                a[k] = c[i];  
                backtrack(a, k, n);  
            }  
        }     
    }  
      
      
    int main(void)  
    {  
        int a[3];  
		b[0] = 10;
		b[1] = 98;
		b[2] = 1;
        backtrack(a, -1, 3);  
        return 0;  
    }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值