整数划分(二)
时间限制:
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
-
第一行是一个整数T表示共有T组测试数据(T<=50)
dp 不太会,正在理解中....
dp[i][j] 表示 i 的 j 划分。
最关键的思路是如何找到一个递推的方法去生成不会重复的解,本题分成这样两种:
1,如果 j 部分全部都大于1,那么相当于 i-j 的j 划分,即为 dp[i-j][j]
2,如果有一部分的值为1,那么就是i-1 的j-1 划分,即为dp[i-1]][j-1]
两种情况没有重叠且能覆盖所有的解,因此相加即为 i 的 j 划分。
/*
http://blog.csdn.net/liuke19950717
*/
#include<cstdio>
#include<cstring>
int main()
{
int dp[105][105]={1};
for(int i=1;i<105;++i)
{
for(int j=1;j<=i;++j)
{
dp[i][j]=dp[i-j][j]+dp[i-1][j-1];
}
}
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
printf("%d\n",dp[n][m]);
}
return 0;
}