dfs+剪枝优化
正常dfs: 注意为了去重(如{1,2,4}和{2,1,4})用i=last保证它是唯一非递减序列
剪枝: 注意点 循环上限n可替换为(n-sum)/(k-step) 即当前的剩余和/剩余步数 如果有参数超过这个平均值必定会超过范围
#include<bits/stdc++.h>
using namespace std;
int n,k,num[200];
int ans=0;
void dfs(int last,int step,int sum){
if(step==k){
if(sum==n)ans++;
return ;
}
int max_n=(n-sum)/(k-step);
for(int i=last;i<=max_n;++i){//last
num[step]=i;
dfs(i,step+1,sum+i);
}
}
void solve(){
cin>>n>>k;
dfs(1,0,0);
cout<<ans;
}
int main(){
ios::sync_with_stdio(false),cin.tie(nullptr);
int T=1;
while(T--){
solve();
}
return 0;
}