我们可以搜索每一组数时用数组存起来,为了避免重复当搜索到第k组数时,可以从第a[k-1]开始搜起。当k==m时如果剩下的数比之前的大,ans++。如果n已经为0直接退出。
#include<iostream>
#include<cstdio>
using namespace std;
int n,k,ans,a[10];
void dfs(int x)
{
if(n==0) return ;
if(x==k)
{
if(n>=a[x-1]) ans++;
return ;
}
for(int i=a[x-1];i<=(n/(k-x+1));i++)
{
a[x]=i;
n-=i;
dfs(x+1);
n+=i;
}
}
int main()
{
cin>>n>>k;
a[0]=1;
dfs(1);
cout<<ans;
return 0;
}