请教一道题 望大家帮忙
求 A=(1,3,5,7,9)的所有子集
全子集题目,其实每个元素只有两个状态:选与不选。
你可以用回溯来写这个程序。
[[it] 本帖最后由 StarWing83 于 2008-9-11 10:23 编辑 [/it]]
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 100 int s[N], a[N], n; void comb(int t) { if (t == n) { int i; for (i = 0; i < n; i++) if (s[i]) printf("%d ", a[i]); } else { s[t] = 1; comb(t + 1); s[t] = 0; comb(t + 1); } } int main(void) { while (scanf("%d", &n) == 1) { int i; for (i = 0; i < n; i++) scanf("%d", &a[i]); memset(s, 0, n); comb(0); } return 0; }
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 100 int s[N], a[N], n; void comb() { int i, k = 0; while (k >= 0) { if (k == n) { for (i = 0; i < n; i++) if (s[i])printf("%d ", a[i]); printf("\n"); s[--k]++; } else if (s[k] >= 2) s[k] = 0, s[--k]++; else k++; } } int main(void) { while (scanf("%d", &n) == 1) { int i; for (i = 0; i < n; i++) scanf("%d", &a[i]); memset(s, 0, n); comb(0); } return 0; }
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 100 int s[N], a[N], n; void comb() { int i, k = 0; while (k < n) { for (i = 0; i < n; i++) if (s[i])printf("%d ", a[i]); printf("\n"); for (s[k=0]++; s[k] >= 2; s[k]++) s[k++]=0; } } int main(void) { while (scanf("%d", &n) == 1) { int i; for (i = 0; i < n; i++) scanf("%d", &a[i]); memset(s, 0, n); comb(0); } return 0; }