题目描述 https://www.luogu.org/problemnew/show/P1025
为了保证分法不重复,后一项一定要大于等于前一项,再加上一小部分剪枝。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k,ans;
void dfs(int now,int last,int rest)
{
if(now>k) return;
if(now==k&&rest==0) return;
if(rest==0&&now<k) return;
if(now==k&&rest>0)
{
ans++; return;
}
for(int i=last;i*(k-now+1)<=rest;i++) dfs(now+1,i,rest-i);
}
int main()
{
scanf("%d%d",&n,&k);
if(k==1){ puts("1"); return 0;}
int mm=n/k;
dfs(1,1,n);
printf("%d",ans);
return 0;
}```