题目传送门sxazr
本题应该想到分解的数递增,这样可避免重复,即 a[i]>a[i-1];
a[i]的上界,m=n-(a[1]+a[2]+…+a[i-1])平均分成k-(i-1)份,即 a[i]<=m/(k-i+1);
代码
#include <iostream>
#include <cstdio>
using namespace std;
int n,k,ans,d,a[210];
void dfs(int x) //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;
}