题目:M个同样的球放在N个同样的盒子里,不允许有的盒子空着不放,请编写程序计算共有多少种不同的分法?(用k表示) ps: 5,1,1和1,5,1是同一种分法。
我的解法:
#include <stdio.h>
#include <memory.h>
int Sum = 0;
void SonFun(int m, int n,int front, int *pResult,int N)
{
if(n == 1)
{
*(pResult+N-n) = m;
Sum++;
return;
}
int *tmp = new int[N];
int temp = m/n;
for(int i=front; i<=temp; i++)
{
memcpy(tmp,pResult,sizeof(int)*N);
*(pResult+N-n) = i;
SonFun(m-i, n-1, i, pResult,N);
memcpy(pResult,tmp,sizeof(int)*N);
}
}
void MainFun(int m, int n)
{
if(n == 0) return;
int *pResult = new int[n];
int temp = m/n;
for(int i=1; i<=temp; i++)
{
memset(pResult,0,sizeof(int)*n);
*pResult = i;
SonFun(m-i, n-1, i, pResult, n);
}
printf("共有%d种分法\n",Sum);
}
int main(int argc, char** argv)
{
int m = 8;
int n = 3;
MainFun(m,n);
return 1;}
忘牛人批评指正