/*
程序作用:从集合{1,2,3,4,5}中选择k个元素的所有组合方式,k由用户输入
程序设计者:calm
程序设计时间:2007-12-14
程序思想:假设集合有n个元素,选出k个元素,可以递归思想来考虑,即将集合分为第1个和后面(n-1)两个部分
如果包含第1个,则从后面的(n-1)个元素中选出(k-1)个来组合;如果集合不包含第1个元素,则从后面的(n-1)
个元素中选出k个元素组合。
*/
#include<stdio.h>
int m[5],j,len; //定义全局整形变量j,全局整形数组m[5]用来存放找出的元素组合,len表示要选出子集的个数
/*
定义Comb(int p[],int n,int i,int k)
p[]为集合{1,2,3,4,5},n为集合的个数,i为从第i个元素开始寻找,k为所找元素个数
*/
void Comb(int p[],int n,int i,int k)
{
if(k==0)
{
for(j=0;j<5;j++) //循环输出选出组合
{
if(m[j]!=0)
printf("%d ",m[j]);
}
printf("\n");
}
else
{
if(k<=n-i)
{
m[j]=p[i];
j++;
Comb(p,n,i+1,k-1); //递归开始
j=len-k;
Comb(p,n,i+1,k);
}
}
}
void main()
{
int i,k,a[5]={1,2,3,4,5};
printf("Collects:");
for(i=0;i<5;i++)
{
printf("%d ",a[i]);
}
//输出集合中包含k个元素的子集
printf("\nHow many element do you want to choose:");
scanf("%d",&k);
len=k;
printf("As follows:\n");
Comb(a,5,0,k); //调用Comb函数
//输出集合的所有子集
/*
getchar();
i=1;
while(i<=5)
{
printf("include %d:\n",i);
len=i;
Comb(a,5,0,i); //调用Comb函数
putchar('\n');
i++;
}
*/
printf("\nThe end!");
getche();
}