上面的程序是取一个普通组合数的,如C(N,M):
#include <stdio.h>
#include <stdlib.h>
const int MAXSIZE = 80;
int N,M;
int A[MAXSIZE], B[MAXSIZE];
void Print()
{
int i;
for (i = 0; i < M; ++i)
printf("%d ", B[i]);
printf("\n");
}
void Com(int n, int m)
{
int i;
for (i = n; i >= m; --i){ //抽屉原理
B[m] = A[i];
if (m > 0)
Com(i-1,m-1);
else
Print();
}
}
int main()
{
int i;
/* printf("%s", "Input N M = ");
scanf("%d%d", &N,&M);
*/
N = 5;
M=3;
if (N > MAXSIZE)
return 1; //越界
for (i = 0; i < N; ++i)
A[i] = i+1;
Com(N-1,M-1);
system("pause");
return 0;
}
下面是求一个集合的所有子集,是NP问题,也就是你要的解答:
一个取集合的所有子集的算法:
void Calcu(int i, const int n, int A[], int B[])
{
if(i>=n){
int j;
for (j = 0; j < n; j++)
if (B[j]) printf("%c",A[j]);
printf("\n");
} else {
B[i] = 1; //取第i个元素
Calcu(i+1, n, A, B);
B[i] = 0; //舍第i个元素
Calcu(i+1, n, A, B);
}
}//集合的幂集问题是NPC的,也就是说规模是指数级别,上述程序效率是O(2^n)
转自:
http://expert.csdn.net/Expert/topic/2059/2059607.xml?temp=.5402033