题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=176
时间限制:1000 ms | 内存限制:65535 KB
难度:3
输入
第一行是一个整数T表示共有T组测试数据(T<=50)
每组测试数据都是两个正整数m,n,其中(1<=n<=m<=100),分别表示要拆分的正数和拆分的正整数的个数。
输出
输出拆分的方法的数目。
样例输入
2 5 2 5 3
样例输出
2 2
描述
把一个正整数m分成n个正整数的和,有多少种分法?
例:把5分成3个正正数的和,有两种分法:
1 1 3
1 2 2
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]
我的代码如下(dp还在努力理解中):
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn = 110;
int dp[maxn][maxn] = {1};
void solve()
{
for(int i=1;i<maxn;i++)
{
for(int j=1;j<=i;j++)
{
dp[i][j] = dp[i-1][j-1] + dp[i-j][j];
}
}
}
int main()
{
ios::sync_with_stdio(false);
solve();
int t,n,m;
cin>>t;
while(t--)
{
cin>>n>>m;
cout<<dp[n][m]<<endl;
}
return 0;
}