其实这是个整数划分的裸题
类似的事情还有 集合划分
这里我们记n的m划分的个数为
1 当n<m 时候 f(n,m)= f(n,n)
2 n>m 根据划分中是否包含最大值m 可以分为两种情况
(1)划分中包含m的情况,即
,其中
的和为n-m,因此这种情况下为
。
(2)划分中不包含m的情况,则划分中所有值都比m小,即n的 划分,个数为
因此 。
综上
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
#include <bitset>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <map>
#include <set>
#include<iomanip>
#include <bits/stdc++.h>
/***************************************/
#define ll long long
#define int64 __int64
#define PI 3.1415927
#define INF 1000000
const int maxn = 20;
#define rep(i,n) for(int i=0;i<(n);i++)
using namespace std;
#include <bits/stdc++.h>
int main()
{ int t;
cin>>t;
int dp[maxn][maxn];
while(t--)
{
int m,n;
cin>>m>>n;
memset( dp,0,sizeof(dp));
for(int i=1;i<=m;i++){
dp[0][i]=1;
dp[i][1]=1;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(i<j){
dp[i][j]=dp[i][i];
}
if(i==j){
dp[i][j]=1+dp[i][j-1];
}
if(i>j){
dp[i][j]=dp[i][j-1]+dp[i-j][j];
}
}
}
cout<<dp[m][n]<<endl;
}
return 0;
}