#include<stdio.h>
int m,n;
int count;
void recur(int num,int c,int qian)
{
int i;
if(num<0)
return;
if(num==0)
{
if(c == n)
count++;
return;
}
for(i=num;i>=1;i--)
{
if(i<=qian || c==0)
recur(num-i,c+1,i);
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
count =0;
scanf("%d %d",&m,&n);
recur(m,0,0);
printf("%d\n",count);
}
return 0;
题目 176
整数划分(二)
时间限制:1000 ms | 内存限制:65535 KB
难度:3
描述
把一个正整数m分成n个正整数的和,有多少种分法?
例:把5分成3个正正数的和,有两种分法:
1 1 3
1 2 2
输入
第一行是一个整数T表示共有T组测试数据(T<=50)
每组测试数据都是两个正整数m,n,其中(1<=n<=m<=100),分别表示要拆分的正数和拆分的正整数的个数。
输出
输出拆分的方法的数目。
样例输入
2
5 2
5 3
样例输出
2
2
#include <stdio.h>
int fun(int n,int m)
{
if(n < m)
return 0;
if(n == m)
return 1;
if(m == 1)
return 1;
if(n > m)
return fun(n-1,m-1) + fun(n-m,m);
}
int main(void)
{
int ncase,n,m;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%d%d",&n,&m);
printf("%d\n",fun(n,m));
}
return 0;
}
#include<stdio.h>
int m,n;
int count;
void recur(int num,int c,int qian)
{
int i;
if(num<0)
return;
if(num==0)
{
if(c == n)
count++;
return;
}
for(i=num;i>=1;i--)
{
if(i<=qian || c==0)
recur(num-i,c+1,i);
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
count =0;
scanf("%d %d",&m,&n);
recur(m,0,0);
printf("%d\n",count);
}
return 0;
}