m个人分成n组,要求每组最少一个人,如何用C语言编程求所有可能的解?
数学上可以用排列组合的方法,隔板法来求解,前提是人之间没有差别,如果人数大于分组数,那么就相当于将n-1个隔板插进m-1个人之间,解的个数用排列组合的C运算来求,比如说三个人分两组,那么解的个数为2X1/1=2,如果五个人分三组,那么解的个数为5X4X3/(3X2X1)=10;
如果用程序实现,可以采用递归调用加指针,我的算法有点麻烦,可能还有更简单的:
#include "stdafx.h"
int m,n;
int *a;
int *ini;
void main()
{
void allocate(int q,int r);
while(true)
{
scanf("%d",&m);
scanf("%d",&n);
if(m>=n)
{
break;
}
else
{
printf("请重新输入\n");
}
}
a = (int*)malloc(n*sizeof(int));
ini=a;
for(int i=0;i<n;i++)
{
*(a++)=1;
}
a=ini;
allocate(0,n);
}
void allocate(int q,int r)
{
int sum=0;
int next;
if(q>=r)
{
q=r-1;
a=ini;
for(int j=0;j<r;j++)
{
sum=sum+*a++;
}
if(sum==m)
{
a=ini;
for(int k=0;k<r;k++)
{
if(k!=(r-1))
{
printf("%d ",*a++);
}
else
{
printf("%d\n",*a++);
}
}
}
return;
}
else
{
for(int i=0;i<=(m-n);i++)
{
a=ini;
a[q]=i+1;
next=q+1;
allocate(next,r);
}
}
return;
}
因为用了malloc,所以头文件中需要加入malloc.h,程序在VS2010下运行。
结果截图:
三人两组
五人三组
七人三组
这个是楼主要的答案吗?