写法一:DP
#include <iostream>
using namespace std;
const int N=20;
int f[N][N];
int main()
{
int t;
cin>>t;
for(int i=0; i<=10; i++)
{
for(int j=0; j<=10; j++)
{
if(i == 0 || j == 1) f[i][j] = 1;
if(i < j) f[i][j] = f[i][i];
else f[i][j] = f[i][j-1] + f[i-j][j];
}
}
while(t --)
{
int n,m;
cin>>m>>n;
cout<<f[m][n]<<endl;
}
return 0;
写法二:递归
#include <iostream>
using namespace std;
int slove(int m,int n)
{
if(m == 0 || n == 1) return 1;
if(m < n) return slove(m,m);
else return slove(m,n-1) + slove(m-n,n);
}
int main()
{
int t;
cin>>t;
while(t--)
{
int m,n;
cin>>m>>n;
cout<<slove(m,n)<<endl;
}
return 0;
}
写法三:dfs
#include <iostream>
using namespace std;
const int N=20;
int a[N];
int m,n;
int ans=0;
void dfs(int u,int sum,int t)
{
if(sum >= m)
{
if(sum == m && u<=n) ans++;
return ;
}
for(int i=1; i<=m; i++)
{
if(t <= i)
{
dfs(u+1,sum+i,i);
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
ans = 0;
cin>>m>>n;
dfs(0,0,1);
cout<<ans<<endl;
}
}