带注释版本
```cpp
#include<bits/stdc++.h>//万能头
using namespace std; //std命名空间
stack<int> stk;//定义一个stack
int n,k,ans=0,sum=0;//变量,nk不解释,ans答案数,sum目前栈中元素总和
void dfs(){//dfs函数
if(stk.size()==k){//如果栈满了
if(sum==n){//如果和为n
ans++;//答案数+1
}
stk.pop();//出栈
return;//回溯
}
for(int i=stk.top()/*因为要排重,所以按单调来搜*/;i*(k-stk.size())<=n-sum/*剪枝*/;i++){
stk.push(i);//入栈
sum+=i;//总和+i
dfs();//继续搜索
sum-=i;//总和-i
}
}
int main(){//主函数
scanf("%d %d",&n,&k);//输入
for(int i=1;i*k<=n;i++){//循环枚举第一个数
stk.push(i);//将第一个数入栈
sum+=i;//总和+i
dfs();//开始搜索
stk.pop();//出栈
sum-=i;//总和-i
}
printf("%d",ans);//输出
return 0;
}
```
by 大米爱干饭 @ 2023-03-05 21:34:56
```cpp
#include<bits/stdc++.h>
using namespace std;
stack<int> stk;
int n,k,ans=0,sum=0;
void dfs(){
if(stk.size()==k){
if(sum==n){
ans++;
}
stk.pop();
return;
}
for(int i=stk.top();i*(k-stk.size())<=n-sum;i++){
stk.push(i);
sum+=i;
dfs();
sum-=i;
stk.pop();
}
}
int main(){
scanf("%d %d",&n,&k);
for(int i=1;i*k<=n;i++){
stk.push(i);
sum+=i;
dfs();
stk.pop();
sum-=i;
}
printf("%d",ans);
return 0;
}
```
by _Minmatar_Star @ 2023-03-06 18:20:20
把stack删了,用纯递归已AC,大佬们不用费心了
by 大米爱干饭 @ 2023-03-06 19:24:32