所谓幂集,就是一个集合的子集的集合。
下面是两个不同的实现。
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; }