思路:二维数组存,第一维存元素,第二维用0/1表示是否包含在子集中
※注意输出子集的格式,最后一给元素后面无逗号※
//包含N个整数的集合S,求S的所有元素个数为M的子集(0≤M≤N)
//例:N=4,S={1,2,3,4},若M=2,则输出结果为{1,2}{1,3}{1,4}{2,3}{2,4}{3,4}
//用二维数组表示,第一维存元素,第二维0/1表示是否包含在子集中
#include<stdio.h>
#include<math.h>
#define N 5
#define M 3
int main() {
int a[N][2]= {0},i,j,k,m,num,count; //count表示子集中元素的个数(1的个数)与M比较
for(i=0; i<N; i++) {//第一维存元素
scanf("%d",&a[i][0]);
}
num=pow(2,N);//子集个数
for(j=0; j<num; j++) {
for(k=0; k<N; k++) {
a[k][1]=0;
}
m=j;
i=0;
count=0;//1的个数
while(m!=0) {
a[i][1]=m%2;
if(a[i][1]==1) count++;
m=m/2;
i++;
}
if(count==M) {//子集元素个数符合条件的才输出
printf("{");
for(i=0; i<N; i++) {
if(a[i][1]==1) {//注意输出的格式,最后一个元素后面无逗号
if(count>1) {
printf("%d,",a[i][0]);
} else {
printf("%d",a[i][0]);
}
count--;
}
}
printf("}");
}
}
return 0;
}